5

我在我的项目中使用来自 NuGet 的Extended WPF Toolkit Community Edition v2.6,但我不知道我是否应该做更多的事情来允许我设置主题或自定义控件模板。

在要求 Designer/Blend 为 PropertyGrid 控件创建现有默认模板的副本后,UI 已损坏。模板看起来正确,但在设计时或运行时不再起作用。

在此处输入图像描述

选择将默认模板复制到新的样式后:

图片

有没有一种简单的方法来编辑这个控件的内置样式?我真的只是想覆盖 PropertyGrid 的编辑器/标签的前景色/背景色。

我在 XAML 中尝试了一些手动戳,但成功有限:

<Style TargetType="{x:Type xctk:DropDownButton}">
  <Setter Property="Background" Value="Black"/>
  <Setter Property="Foreground" Value="White"/>
</Style>
<Style TargetType="{x:Type xctk:CustomPropertyItem}">
  <Setter Property="Background" Value="Black"/>
  <Setter Property="Foreground" Value="White"/>
</Style>
<Style TargetType="{x:Type xctk:PropertyGridEditorCollectionControl}">
  <Setter Property="Background" Value="Black"/>
  <Setter Property="Foreground" Value="White"/>
</Style>

尝试创建属性容器样式时,通过复制默认值,我得到“复制样式失败”。VS Designer 或 Blend 中的错误。

在此处输入图像描述

结果如下:

复制样式错误

我已经尝试手动包含 Xceed Toolkit 程序集中的 generic.xaml,但它并没有解决问题。

我尝试了两种引用资源的方法:

<ResourceDictionary Source="/Xceed.Wpf.Toolkit;component/themes/generic.xaml" />

<ResourceDictionary Source="pack://application:,,,/Xceed.Wpf.Toolkit;component/Themes/generic.xaml">

这是我尝试设置 PropertyContainerStyle 时来自 Designer 的堆栈跟踪:

堆栈跟踪

4

2 回答 2

1

Blend 中的“编辑副本”选项并不总是准确的。使用复制的模板时,您无法在 PropertyGrid 中看到 PropertyItems,因为未复制 ItemsSource。

查看针对“PropertyGrid”的样式中的“PART_PropertyItemsControl”:没有 ItemsSource。将其设置为:ItemsSource="{Binding Properties,RelativeSource={RelativeSource TemplatedParent}}",您将看到 PropertyItems。

于 2016-09-13T13:41:22.140 回答
0

PropertyGrid要直接从 Xceed.Wpf.Toolkit.dll获取完整的控制模板,您可以尝试在任何 WPF 应用程序中使用此代码(请注意,您需要<Grid x:Name="RootGrid" />在 xaml 中的任何位置才能使此示例正常工作):

        var type = Assembly.LoadFile(@"C:\path\to\file\Xceed.Wpf.Toolkit.dll")
            .GetType("Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid");

        // Instantiate the type.
        var info = type.GetConstructor(Type.EmptyTypes);
        var control = (Control)info.Invoke(null);

        // Add it to the grid (but keep it hidden).
        control.Visibility = Visibility.Collapsed;
        this.RootGrid.Children.Add(control);

        // Get the template.
        var template = control.Template;

        // Get the XAML for the template.
        var settings = new XmlWriterSettings();
        settings.Indent = true;
        var sb = new StringBuilder();
        var writer = XmlWriter.Create(sb, settings);
        XamlWriter.Save(template, writer);

        // Display the template any appropriate way.
        Trace.Write(sb.ToString());

在获得控制模板 xaml 后,sb.ToString()您可以复制/粘贴它以在您的PropertyGrid和编辑您需要的任何颜色中使用。

于 2016-03-28T14:22:36.253 回答