【问题标题】:WPF Updating dynamic resource at runtime not working for a path inside a canvasWPF 在运行时更新动态资源不适用于画布内的路径
【发布时间】:2016-02-22 09:50:57
【问题描述】:

我在尝试在运行时更改画布内路径的颜色时遇到问题。我使用画布作为按钮背景的视觉画笔。我希望用户能够从菜单中更改颜色并让它在应用程序范围内更新。把它想象成一个主题转换器。这是我的代码..

<SolidColorBrush x:Key="ColorMain">#FF222222</SolidColorBrush>

上面是我定义颜色的方式,下面你可以看到我将它用作 Sync_Background 画布中路径的描边。

<VisualBrush x:Key="SyncBrush">
    <VisualBrush.Visual>
        <Canvas x:Name="SyncButton" HorizontalAlignment="Left" Height="200" UseLayoutRounding="False" VerticalAlignment="Top" Width="350">
            <Canvas x:Name="Sync_Background" Height="200" Canvas.Left="0" Canvas.Top="0" Width="350">
                <Path Data="F1M0,200L350,200 350,0 0,0z" Fill="#FF55565D" Height="200" Canvas.Left="0" Canvas.Top="0" Width="350"/>
                <Path Data="M355,205L5,205 5,5 355,5z" Height="210" Canvas.Left="-5" Stroke="{DynamicResource ColorMain}" StrokeThickness="10" Canvas.Top="-5" Width="360"/>
            </Canvas>
            <Canvas x:Name="Sync_Layer" Height="92.935" Canvas.Left="110.823" Canvas.Top="20.532" Width="128.354">
                <Path Data="M6.599,38.127C16.446,19.891 35.729,7.5 57.908,7.5 81.062,7.5 101.062,21.004 110.461,40.567" Height="43.815" Canvas.Left="2.788" Stroke="#FFC1BFBF" StrokeThickness="15" Canvas.Top="-7.5" Width="117.222"/>
                <Path Data="F1M0,9.199L25.316,34.649 34.703,0z" Fill="#FFC1BFBF" Height="34.649" Canvas.Left="93.651" Canvas.Top="23.623" Width="34.703"/>
                <Path Data="M110.624,5.689C100.776,23.924 81.493,36.315 59.314,36.315 36.16,36.315 16.16,22.811 6.76,3.249" Height="43.814" Canvas.Left="8.344" Stroke="#FFC1BFBF" StrokeThickness="15" Canvas.Top="56.62" Width="117.223"/>
                <Path Data="F1M34.703,25.45L9.386,0 0,34.649z" Fill="#FFC1BFBF" Height="34.649" Canvas.Left="0" Canvas.Top="34.664" Width="34.703"/>
            </Canvas>
        </Canvas>
    </VisualBrush.Visual>
</VisualBrush>

以下是我尝试在运行时更改颜色的方法。 Colors.Crimson 可以是用户选择的任何内容。

Application.Current.Resources["ColorMain"] = new SolidColorBrush(Colors.Crimson);
InvalidateVisual();

有什么想法吗?我正在调试,我注意到在我进行颜色更改后的视觉画笔内部,路径的笔划值没有像我的应用程序中的其他内容一样更新。我在想也许它与嵌套在另一个画布中有关?我这样做的原因是,当您导入 Illustrator 文件时,这是从混合中吐出的内容。

【问题讨论】:

    标签: c# wpf windows user-interface


    【解决方案1】:

    VisualBrush 中使用DynamicResource 的成功率很低。我们必须将所有画笔定义(包括所有VisualBrush)放入我们的资源文件中,当您更改主题时该文件会重新加载。用您的主题颜色、画笔和字体替换整个ResourceDictionary,而不仅仅是其中的一种颜色。你可以这样冻结你的画笔。您可以在 VisualBrush 中使用 StaticResource 引用。在您控制的某处,您可以使用DynamicResource 引用VisualBrush

    【讨论】:

    • 所以如果我理解正确的话。目前您必须切换所有画笔的颜色,然后重新加载整个资源文件?
    • 是的。我为每个主题都有单独的资源文件。当用户请求更改主题时,我会加载相应的文件。我不会动态更改画笔上的颜色,但高对比度主题除外,其中画笔动态绑定到系统颜色(而不是冻结)。
    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多