首页 > 解决方案 > SystemResourceKey 引用的 WPF 视图样式

问题描述

我正在尝试复制Style. DataGridComboBoxColumn's TextBlockComboBox这是DataGridComboBoxColumn当不编辑列的单元格时使用的控件。我可以通过查看referencesource.microsoft.com上的源来了解此控件(我会尝试直接链接到有问题的类型,但我工作笔记本电脑上的浏览器有一个破坏 URL 的安全插件)。这是该来源的一个片段:

    internal class TextBlockComboBox : ComboBox
    {
        static TextBlockComboBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(TextBlockComboBox), new FrameworkPropertyMetadata(DataGridComboBoxColumn.TextBlockComboBoxStyleKey));
            KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(TextBlockComboBox), new FrameworkPropertyMetadata(false));
        }
    }

    /// <summary>
    ///     Style key for TextBlockComboBox
    /// </summary>
    public static ComponentResourceKey TextBlockComboBoxStyleKey
    {
        get
        {
            return SystemResourceKey.DataGridComboBoxColumnTextBlockComboBoxStyleKey;
        }
    }

从这个代码片段中,您可以看到Style该控件的键在 中定义SystemResourceKey.DataGridComboBoxColumnTextBlockComboBoxStyleKey。我想复制它Style以便在我自己的代码库中进行添加和修改。但是,我似乎找不到Style这个键所指的那个。我尝试复制控件(因为它是内部类型)并使用 Visual Studio 设计器的编辑模板功能来获取生成的副本Style/Template,但我得到的只是默认的ComboBox Template. 从那里,我尝试简单地使用此默认值ComboBox Style并尝试对其进行修改,直到它类似于 的StyleTextBlockComboBox但这只会导致问题。

有人知道如何确定Stylefor key中定义的内容SystemResourceKey.DataGridComboBoxColumnTextBlockComboBoxStyleKey吗?

标签: c#.netwpfdatagridwpf-controls

解决方案


以下是它PresentationFramework.Aero2.dll在 Windows 8 及更高版本中的定义方式:

<Style x:Key="{x:Static DataGridComboBoxColumn.TextBlockComboBoxStyleKey}" TargetType="{x:Type ComboBox}">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBox}">
                <ContentPresenter Margin="1,1,1,1" Content="{TemplateBinding ComboBox.SelectionBoxItem}"
                            ContentTemplate="{TemplateBinding ComboBox.SelectionBoxItemTemplate}"
                            ContentTemplateSelector="{TemplateBinding ItemsControl.ItemTemplateSelector}"
                            ContentStringFormat="{TemplateBinding ComboBox.SelectionBoxItemStringFormat}"
                            VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
                            HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                            SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" IsHitTestVisible="false"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

推荐阅读