WPF静态资源与动态资源
我的Xaml如下所示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
<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;
}