gpt4 book ai didi

c# - 是否可以在 VisualStateManager 中修改静态资源?

转载 作者:行者123 更新时间:2023-11-30 17:40:49 24 4
gpt4 key购买 nike

我有一些字体大小、画笔等全局常量。示例:

<x:Double x:Key="SmallWindowWidth">0</x:Double>
<x:Double x:Key="CompactWindowWidth">600</x:Double>
<x:Double x:Key="MediumWindowWidth">720</x:Double>
<x:Double x:Key="WideWindowWidth">1024</x:Double>

<x:Double x:Key="SmallTitleFontSize">22</x:Double>
<x:Double x:Key="NormalFontSize">16</x:Double>

当 Window Width 变小时,我想减少一些文本的 FontSize。当然,我可以单独针对其中的每一个,但我更愿意做的是全局更改 {StaticResource NormalFontSize},如下所示:

<VisualState x:Name="Small">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="{StaticResource SmallWindowWidth}" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="{StaticResource NormalFontSize}" Value="12"/>
</VisualState.Setters>
</VisualState>

...这似乎不起作用,因为它不是属性(property)。那么,有什么方法可以更改 XAML (!) 中的静态资源吗?

最佳答案

好吧,您可以通过一些调整来实现。请注意,我已经在 UWP 中对它进行了本地测试以回答您的问题,但我还没有在我发布的任何项目中使用它。

第一步,

  • 如果您需要更改具有依赖属性的资源,例如纯色画笔的颜色。[无需包装器]
  • 如果您需要更改不具有 double 值等依赖属性的资源[需要包装器]

    public class DoubleWrapper : DependencyObject
    {
    public double Value
    {
    get { return (double)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Value. This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register("Value", typeof(double), typeof(DoubleWrapper), new PropertyMetadata(0.0));

    }

第二步,除了强制性的 x:Key 之外,您还需要定义 x:Name 以便能够在视觉状态 setter 中定位静态资源。 (如果需要,您可以为 x:Name 使用不同的名称)

    <Page.Resources>
<local:DoubleWrapper x:Name="FontSizeWrapper" x:Key="FontSizeWrapper" Value="12"/>
<SolidColorBrush x:Name="MainBrush" x:Key="MainBrush" Color="Red"/>
</Page.Resources>

最后,当您在 Visual state setter 中更改 FontSizeWrapper 或 MainBrush 的 Value 属性时,它将更新所有绑定(bind)。

<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="LayoutStates">
<VisualState x:Name="NarrowState">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0"/>
</VisualState.StateTriggers>
<VisualState.Setters>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="WideState">
<VisualState.Setters>
<Setter Target="FontSizeWrapper.(DoubleWrapper.Value)" >
<Setter.Value>
<x:Double>25</x:Double>
</Setter.Value>
</Setter>
<Setter Target="MainBrush.(SolidColorBrush.Color)" Value="Aqua" />
</VisualState.Setters>
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="800"/>
</VisualState.StateTriggers>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock Text="This is test" Foreground="{StaticResource MainBrush}"
VerticalAlignment="Center"
FontSize="{Binding Value, Source={StaticResource FontSizeWrapper}}"/>
</Grid>

关于c# - 是否可以在 VisualStateManager 中修改静态资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33822317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com