【问题标题】:Why can I not set a SolidColorBrush resource value from code?为什么我不能从代码中设置 SolidColorBrush 资源值?
【发布时间】:2013-09-08 01:54:33
【问题描述】:

我在我的 xaml 中定义了一个资源:

<core:WidgetBase xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  x:Class="....Silverlight.LiquidityConstraintsView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:core="clr-namespace:...Silverlight;assembly=....Silverlight"
    xmlns:local="clr-namespace:....Silverlight"
    mc:Ignorable="d">

    <core:WidgetBase.Resources>
        <SolidColorBrush x:Key="..." />
    </core:WidgetBase.Resources>
...

我正在尝试从代码中设置它:

void _administrationClient_GetByFilterModuleSettingCompleted(object sender, GetByFilterModuleSettingCompletedEventArgs e)
{
        this.Resources["..."] = new SolidColorBrush(Colors.Red);
}

但我得到了错误:

方法或操作没有实现。

堆栈跟踪:

   at System.Windows.ResourceDictionary.set_Item(Object key, Object value)
   at ....Silverlight.LiquidityConstraintsView._administrationClient_GetByFilterModuleSettingCompleted(Object sender, GetByFilterModuleSettingCompletedEventArgs e)
   at ....Service.AdministrationServiceClient.OnGetByFilterModuleSettingCompleted(Object state)

当我向服务器发送请求以获取颜色时,会发生这种情况,然后当它返回时,我尝试将该颜色设置为资源,即使我尝试将其设置为红色,它也会失败。

如果有帮助,我设置它的方法是从 WCF 调用到服务器的异步回调方法。

【问题讨论】:

  • 它应该可以工作。我在最后尝试过它可以工作。你到底在哪里设置这个值你能分享更多的代码吗?
  • 我同意,该错误与此典型操作不匹配。我们可以有一个堆栈跟踪吗?
  • 也许这是因为:Silverlight does not support dynamic resources. All resource references to keyed resources in XAML are static. Link on MSDN

标签: wpf silverlight colors resources


【解决方案1】:

如果您在新的 WPF 应用程序中尝试,此操作将按预期工作:

<Window.Resources>
    <SolidColorBrush x:Key="Brush" Color="Aqua" />
</Window.Resources>

public MainWindow()
{
    this.Resources["Brush"] = new SolidColorBrush(Colors.Green);
    InitializeComponent(); 
}

因此,我建议您,您的问题出在其他地方。

更新>>>

如何完全避免这个问题并在您的MainWindow.xaml.cs 中简单地使用public 属性?

MainWindow.xaml.cs:

public SolidColorBrush Brush { get; set; }

那么在您的应用程序中的任何地方,您应该可以像这样访问这个属性:

((MainWindow)App.Current.MainWindow).Brush = new SolidColorBrush(Colors.Red);

【讨论】:

  • 是的,我在一个新的 WPF 应用程序中尝试过,它可以工作,但我使用的是 silverlight,也许它会有所作为。
  • 是的,我可以使用公共属性,唯一的问题是我需要在 IValueConverter 中使用这种颜色...
【解决方案2】:

如果您在 Reflector(用于 Silverlight)中查看 ResourceDictionary 的设置器,您会看到它抛出了 NotImplementedException,因此这在 Silverlight 中不起作用。

您可以尝试删除资源并重新添加它,但这是在黑暗中尝试。

【讨论】:

    【解决方案3】:

    “此索引器实现专门阻止“设置”使用。如果您尝试使用索引器设置值,则会引发异常。您必须删除并重新添加到 ResourceDictionary 才能更改键值对。”

    http://msdn.microsoft.com/en-us/library/ms601221(v=vs.95).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 2019-07-18
      • 2019-01-23
      • 1970-01-01
      相关资源
      最近更新 更多