Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF静态资源与动态资源_Wpf_Resources_Staticresource_Dynamicresource - Fatal编程技术网

WPF静态资源与动态资源

WPF静态资源与动态资源,wpf,resources,staticresource,dynamicresource,Wpf,Resources,Staticresource,Dynamicresource,我的Xaml如下所示 <Window.Resources> <SolidColorBrush x:Key="BrushMe" Color="Red"/> <SolidColorBrush x:Key="FreezeBrushMe" po:Freeze="true" Color="Yellow"/> </Window.Resources> <StackPanel> <Button Backg

我的Xaml如下所示

<Window.Resources>
    <SolidColorBrush x:Key="BrushMe" Color="Red"/>
    <SolidColorBrush x:Key="FreezeBrushMe" po:Freeze="true"  Color="Yellow"/>
</Window.Resources>
<StackPanel>        
    <Button Background="{StaticResource BrushMe}">Static</Button>
    <Button Background="{DynamicResource BrushMe}">Dynamic</Button>
    <Button Click="Button_Click">ChangeColorProperty</Button>
    <Button Click="Button1_Click">ChangeBrushObject</Button>
    <!--<Button Background="{StaticResource NotExistResource}" Click="Button_Click_1">GenerateResourceForStatic</Button>-->
    <Button Background="{DynamicResource NotExistResource}" Click="Button_Click_1">GenerateResourceForDynamic</Button>
    <Button Background="Green" Click="Button_Click_1">FixedBrush</Button>
    <Button Background="{StaticResource FreezeBrushMe}">FreezeBrushStatic</Button>
    <Button Background="{DynamicResource FreezeBrushMe}">FreezeBrushDynamic</Button>
    <Button Click="Button_Click_2">ChangeFreezeColorProperty</Button>
    <Button Click="Button_Click_3">ChangeFreezeBrushObject</Button>
</StackPanel>
我的问题是,如果我先单击ChangeBrushObject按钮,它会将动态按钮更改为黄色,然后单击ChangeColorProperty按钮,它只会将动态按钮更改为蓝色,而不会影响静态按钮

但是,如果我单独单击ChangeColorProperty按钮,它会将静态和动态按钮都更改为蓝色

为什么会这样?当试图将新对象分配给已被控件引用为静态资源的资源时,WPF不会抛出任何警告

我还测试了动态资源引用的不存在的资源。正如所料,如果StaticResource引用了一个不存在的资源,Xaml将在编译时发出抱怨,而DynamicSource则不会。但是,如果单击GenerateResourceForDynamic按钮,它会显示绿色作为背景,但随后它会淡出,再次出现,并重复。为什么会这样

编辑:添加了冻结资源,再次出现奇怪行为。如果我单击ChangeFriezeColorProperty按钮,它将通过异常。如果我单独单击ChangeFreeScrushObject,它将更改FreeScrushDynamic按钮的颜色。但是,如果我单击ChangeFriezeBrushObject,然后单击ChangeFriezeColorProperty,则不会引发异常


我认为冻结资源将使与资源链接的对象的属性成为只读。这就是为什么在更改属性时,它会通过异常抱怨只读状态。但是,冻结并不能阻止我们更改对象本身。

关于您的最后一个问题。。。没有线索。奇怪的是,颜色是这样出现和消失的。。。也许这与鼠标悬停在按钮上有关?对于你的第一个问题。。。除非资源被冻结,否则修改资源是可以的。如果冻结,
brush.Color=Colors.Blue
将引发异常<代码>静态资源与此无关,静态的不是资源本身,而是引用
StaticResource
表示您正在创建对资源实例的静态引用,该引用可以冻结也可以不冻结。最后一个问题:它看起来像Aero中聚焦按钮的标准动画theme@Aloraman如果我在Xaml中将颜色固定为绿色,则只有当鼠标悬停在按钮上时,颜色才会消失。但在我的例子中,即使鼠标不悬停,颜色也会出现和消失。@almulo我已经修改了我的问题,并添加了一些冻结属性测试。我认为,当将资源从代码隐藏更改为引用新对象时,StaticResource将保持“过时”状态,并且不再与分配给它所引用的资源的新对象相关。通过单击ChangeBrushObject按钮,然后单击ChangeColorProperty按钮,可以批准此操作。
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        SolidColorBrush brush = (SolidColorBrush)this.FindResource("BrushMe");
        brush.Color = Colors.Blue;
        this.Resources["BrushMe"] = brush;
    }

    private void Button1_Click(object sender, EventArgs e)
    {
        SolidColorBrush newBrush = new SolidColorBrush(Colors.Yellow);
        this.Resources["BrushMe"] = newBrush;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        this.Resources.Add("NotExistResource", new SolidColorBrush(Colors.Green));
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        SolidColorBrush brush = (SolidColorBrush)this.FindResource("FreezeBrushMe");
        brush.Color = Colors.Blue;
        this.Resources["FreezeBrushMe"] = brush;
    }

    private void Button_Click_3(object sender, RoutedEventArgs e)
    {
        SolidColorBrush newBrush = new SolidColorBrush(Colors.Red);
        this.Resources["FreezeBrushMe"] = newBrush;
    }