如何使用Blend或VS Designer编辑WPF PropertyGrid

时间:2016-03-18 20:03:21

标签: wpf propertygrid expression-blend-4 wpf-extended-toolkit

我在我的项目中使用NuGet中的Extended WPF Toolkit Community Edition v2.6,但我不知道是否还有其他事情可以让我主题或自定义控件模板。

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

enter image description here

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

Image http://i63.tinypic.com/2pt59oi.png

是否有一种简单的方法可以编辑此控件的内置样式?我真的只是试图覆盖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>

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

enter image description here

结果如下:

Error from Copy Style

我尝试手动包含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中的堆栈跟踪:

stack trace

2 个答案:

答案 0 :(得分:0)

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

        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());

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

答案 1 :(得分:0)

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

看看&#34; PART_PropertyItemsControl&#34;在风格定位&#34; PropertyGrid&#34; :没有ItemsSource。将其设置为: ItemsSource =&#34; {Binding Properties,RelativeSource = {RelativeSource TemplatedParent}}&#34; 你会看到PropertyItems。