如果我更改了一些用作 StaticResource 的資源,那么所有參考的控制元件都會受到影響。
如果資源被稱為 DynamicResource,則不會。
但是在 DynamicResource 中稱為 StaticResource 的一些資源呢?
<Color x:Key="Color">#000000</Color>
<LinearGradientBrush x:Key="GradientBrush" EndPoint="0,0" StartPoint="0,1" >
<GradientStop Color="{StaticResource Color}" Offset="0" />
<GradientStop Color="{StaticResource Color}" Offset="1" />
</LinearGradientBrush>
<DrawingBrush x:Key="TabItemBrush" >
<DrawingBrush.Drawing>
<GeometryDrawing Brush="{StaticResource GradientBrush}">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="0 100 100 100"/>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid x:Name="Root">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected" >
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
Storyboard.TargetProperty="(Panel.Background).(DrawingBrush.Drawing).(GeometryDrawing.Brush).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
<EasingColorKeyFrame KeyTime="0" Value="Red" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Selected">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
Storyboard.TargetProperty="(Panel.Background).(DrawingBrush.Drawing).(GeometryDrawing.Brush).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
<EasingColorKeyFrame KeyTime="0" Value="Blue" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="Border" Background="{DynamicResource TabItemBrush}">
<ContentPresenter x:Name="ContentSite" VerticalAlignment="Center"
HorizontalAlignment="Center" ContentSource="Header"
Margin="12,2,12,2" RecognizesAccessKey="True" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
BorderinTabItem指TabItemBrush使用DynamicResource.
TabItemBrush指GradientBrush使用 StaticResource.
GradientBrush指Color使用StaticResource.
<StackPanel>
<TabControl>
<TabItem Header="AAA" >AAA</TabItem>
<TabItem Header="BBB" >BBB</TabItem>
<TabItem Header="CCC" >BBB</TabItem>
</TabControl>
<Border Background="{DynamicResource GradientBrush}" Height="1000" Width="1000"/>
</StackPanel>
我認為TabItem當我更改所選專案時,所有資源都更改為相同顏色,TabControl因為所有資源都稱為 StaticResource 除了TabItemBrush.
但只有所選專案的顏色為藍色,其他專案為紅色。
此外,如果我將所有 StaticResource 更改為 DynamicResource,它將無法正常作業(全紅或全藍)。
為什么 StaticResource 的作業方式好像不是共享的,而 DynamicResource 的作業方式是共享的?
uj5u.com熱心網友回復:
我發現你的問題很難理解。但是,我認為您很困惑,因為您不了解 和 之間的StaticResource區別DynamicResource。
- 顧名思義,
StaticResource參考將/永遠不會改變(它們是靜態的)。 - using 參考的資源
StaticResource僅在編譯時決議一次。 - 顧名思義,
DynamicResource參考可以改變(它們是動態的)。 - 參考的資源
DynamicResource在運行時決議。 - 由于
StaticResource參考是在編譯時決議的,因此 XAML 決議器可以避免創建中間查找運算式(然后在運行時執行)的開銷。
這就是為什么您應該始終避免DynamicResource以提高應用程式性能為目標。 StaticResource不允許前向參考,而允許DynamicResource- 但前向參考方面在您的背景關系中并不重要。
“如果我更改了一些用作 StaticResource 的資源,那么所有參考的控制元件都會受到影響。”
這絕對是不正確的。您不能更改參考為的資源StaticResource,然后觀察這些更改會更新參考物件 - 這不可能從未發生過(請參閱上面對基本特征的解釋)。
你可能在這里有不同的意思。
“我認為當我在 TabControl 中更改選定的 > 專案時,所有 TabItem 都會變為相同的顏色,因為所有資源都稱為 StaticResource > 除了 TabItemBrush。
但只有所選專案的顏色為藍色,其他專案為紅色。”
這是正確的行為。您已VisualState使用VisualStateManager. 根據這些狀態,單擊 aTabItem會將Background選中項的 修改為藍色,將所有其他未選中項修改為紅色。
“此外,如果我將所有 StaticResource 更改為 DynamicResource,它的作業 > 不正確(全紅或全藍)。”
這是 XAML 引擎在影片背景關系中的特殊行為:它將凍結Storyboard.
這意味著,所有參與的子實體AnimationTimeline(例如ColorAnimation)或Animatable一般型別都被凍結,因此不可更改(它們都繼承了Freezable)。
因此,所有參考的資源都必須是靜態的并且在編譯時已知:如果需要凍結參考實體,Brush則無法參考資源。
a 中使用的資源必須參考為.DynamicResourceStoryboardStaticResource
現在,假設一個元素(例如 a Border)用于DynamicResource參考一個資源,該資源本身包含對其他資源的參考:
- If the element uses
DynamicResourceto reference a pure static resource (a resource that doesn't itself references other resources usingDynamicReference), then the XAML engine will optimize the reference by treating it as aStaticResource, to avoid the overhead, and store it in the internal lookup table for the static resources (remember,StaticResourceis much cheaper in terms of performance costs than looking up aDynamicResource). This resource can be targeted by aStoryboardanimation as it is now static:
<ResourceDictionary>
<Color x:Key="Color">#000000</Color>
<!-- Resource is treated as a static resource -->
<LinearGradientBrush x:Key="GradientBrush" EndPoint="0,0" StartPoint="0,1" >
<GradientStop Color="{StaticResource Color}" Offset="0" />
<GradientStop Color="{StaticResource Color}" Offset="1" />
</LinearGradientBrush>
</ResourceDictionary>
<!-- The lookup behavior is optimized to StaticResource.
A Storyboard therefore will be able to animate the Background resource.
-->
<Border Background="{DynamicResource GradientBrush}" />
- If the resource that an element references is itself referencing at least one resource using
DynamicResource, then the reference will remain dynamic and will prevent e.g., the Storyboard from being frozen and the animation won't work:
<ResourceDictionary>
<Color x:Key="Color">#000000</Color>
<!-- Resource is treated as a dynamic resource,
because it contains at least one DynamicResource reference.
-->
<LinearGradientBrush x:Key="GradientBrush" EndPoint="0,0" StartPoint="0,1" >
<GradientStop Color="{DynamicResource Color}" Offset="0" />
<GradientStop Color="{StaticResource Color}" Offset="1" />
</LinearGradientBrush>
</ResourceDictionary>
<!-- The lookup behavior is now DynamicResource and not optimized.
A Storyboard won't be able to animate the properties of the resource as it can't be frozen.
-->
<Border Background="{DynamicResource GradientBrush}" />
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/452446.html
標籤:wpf
上一篇:如何在密碼框上添加文本框?
下一篇:如何“禁用”WPF用戶控制元件?
