10

ビジュアル スタジオ 2010 | .NET/WPF 4.0

これは WPF のバグである可能性があると思いますが、それに関するバグ レポートが見つからないようです。明らかな何かが欠けている可能性をカバーするために、スタックオーバーフローに答えを求めます!

この xaml を検討してください (分離コードには何もありません):

<Window x:Class="DownExpanders.BorderTest"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="BorderTest" Height="300" Width="300">
    <Window.Resources>
        <Color x:Key="BackgroundColor" R="255" G="0" B="0" A="255"/>
        <Color x:Key="BorderColor" R="0" G="0" B="255" A="255"/>
        <SolidColorBrush x:Key="BorderColorBrush" Color="{DynamicResource BorderColor}"/>
    </Window.Resources>
    <Grid>
        <Border BorderThickness="20">
            <Border.Background>
                <SolidColorBrush Color="{DynamicResource BackgroundColor}"/>
            </Border.Background>
            <Border.BorderBrush>
                <SolidColorBrush Color="{DynamicResource BorderColor}"/>
            </Border.BorderBrush>
        </Border>

        <Border Margin="40" BorderBrush="{DynamicResource BorderColorBrush}" BorderThickness="20"/>
    </Grid>
</Window>

デザイナーでは、期待どおりにレンダリングされます。外側の境界線には大きな青い境界線と赤い背景があり、内側の境界線には大きな青い境界線があります。偉大な。

コードを実行すると、外側の境界線に境界線がありません。ロードされていないように見えます。背景は正しく赤に設定されています。一方、内側の境界線は青い境界線を正しくロードします。

「DynamicResource」をすべて「StaticResource」に変更すると、実行時に正しくレンダリングされます。この矛盾が本当に頭を悩ませているのですが、理解できません.\

そう:

  1. BorderBrush で DynamicResource が機能しないのはなぜですか?
  2. #1を考えると、なぜバックグラウンドで機能するのですか?
  3. リソースで単色ブラシを明示的に定義すると問題が解決するように見えるのはなぜですか?

編集:

MS が修正しないことを決定したのはバグのようです (リンクについてはSheridanに感謝します): http://connect.microsoft.com/VisualStudio/feedback/details/589898/wpf-border-borderbrush-does-not-see-動的リソースの変更

4

5 に答える 5

3

これは、RadialGradientBrush には当てはまらないようです。

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <Grid.Resources>
            <Color x:Key="BackgroundColor" R="255" G="0" B="0" A="255"/>
            <Color x:Key="BorderColor" R="0" G="0" B="255" A="255"/>
            <SolidColorBrush x:Key="BorderColorBrush" Color="{DynamicResource BorderColor}"/>
        </Grid.Resources>
        <Border BorderThickness="20">
            <Border.BorderBrush>
                <RadialGradientBrush>
                    <GradientStop Color="{DynamicResource BorderColor}"/>
                    <GradientStop Color="{DynamicResource BorderColor}"/>
                </RadialGradientBrush>
            </Border.BorderBrush>
            <Border.Background>
                <SolidColorBrush Color="{DynamicResource BackgroundColor}"/>
            </Border.Background>
        </Border>

        <Border Margin="40" BorderBrush="{DynamicResource BorderColorBrush}" BorderThickness="20"/>

    </Grid>
</Window>

ここに画像の説明を入力

于 2013-07-22T14:27:12.727 に答える
0

Border の代わりに使用できるカスタム コントロールを次に示します。BorderBrush プロパティの問題を修正します。別の回答が示すように機能する長方形を使用します。このコントロールは、Border コントロールを使用した場合のパフォーマンスとはおそらく一致しないことに注意してください。ただし、機能するため、必要な場合にのみ使用することをお勧めします。

<Style TargetType="{x:Type controls:BorderFix}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:BorderFix}">
                <DockPanel x:Name="PART_Container"
                           Background="{TemplateBinding Background}"
                           LastChildFill="True"
                           UseLayoutRounding="{TemplateBinding UseLayoutRounding}">
                    <Rectangle x:Name="PART_LeftBorder"
                               DockPanel.Dock="Left"
                               Fill="{TemplateBinding BorderBrush}"
                               Width="{Binding Path=BorderThickness.Left, RelativeSource={RelativeSource TemplatedParent}}"/>
                    <Rectangle x:Name="PART_TopBorder"
                               DockPanel.Dock="Top"
                               Fill="{TemplateBinding BorderBrush}"
                               Height="{Binding Path=BorderThickness.Top, RelativeSource={RelativeSource TemplatedParent}}"/>
                    <Rectangle x:Name="PART_RightBorder"
                               DockPanel.Dock="Right"
                               Fill="{TemplateBinding BorderBrush}"
                               Width="{Binding Path=BorderThickness.Right, RelativeSource={RelativeSource TemplatedParent}}"/>
                    <Rectangle x:Name="PART_BottomBorder"
                               DockPanel.Dock="Bottom"
                               Fill="{TemplateBinding BorderBrush}"
                               Height="{Binding Path=BorderThickness.Bottom, RelativeSource={RelativeSource TemplatedParent}}"/>
                    <ContentPresenter x:Name="PART_Content"/>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

public sealed class BorderFix : ContentControl
{
    static BorderFix()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(BorderFix), new FrameworkPropertyMetadata(typeof(BorderFix)));
    }
}

私たちがこれをしなければならないという事実は、かなりばかげています。別の回答は、このバグが Windows 8 で使用される .NET のバージョンで修正されていることを示唆しています。私はそれをテストしていませんが、それが正しいことを願っています。.NET 4.5.51209 でも同じ問題が発生します。

于 2014-11-04T14:50:29.897 に答える