【问题标题】:How to interpret the style programmatically如何以编程方式解释样式
【发布时间】:2017-11-19 01:17:27
【问题描述】:

在我的应用程序中,我必须在代码隐藏中操作 DataGrid(DataGrid 也在运行时的代码隐藏中创建),并且我想为 DataGrid 设置以下样式

<DataGrid.RowHeaderStyle>
    <Style TargetType="DataGridRowHeader">
        <Setter Property="Visibility" Value="Collapsed"/>
        <Setter Property="Template" Value="{x:Null}"/>
    </Style>
</DataGrid.RowHeaderStyle>

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridRow">
                    <Border BorderThickness="{TemplateBinding Border.BorderThickness}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="DGR_Border" SnapsToDevicePixels="True">
                        <SelectiveScrollingGrid> <!--How to translate this-->
                            <DataGridCellsPresenter ItemsPanel="{TemplateBinding ItemsControl.ItemsPanel}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"/>
                        </SelectiveScrollingGrid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.RowStyle>

以下是我的解释代码,但我不知道如何“翻译”SelectiveScrollingGrid 部分

    var myGrid = new DataGrid
    {
            RowHeaderStyle = new Style(typeof(DataGridRowHeader)),
            RowStyle = new Style(typeof(DataGridRow))
    };

      myGrid.RowHeaderStyle.Setters.Add(new Setter(VisibilityProperty, Visibility.Collapsed));
      myGrid.RowHeaderStyle.Setters.Add(new Setter(DataGridRowHeader.TemplateProperty, null));

ControlTemplate templateButton = new ControlTemplate(typeof(DataGridRow));
      FrameworkElementFactory elemFactory = new FrameworkElementFactory(typeof(Border));
      elemFactory.SetValue(Border.BorderThicknessProperty, new TemplateBindingExtension(Border.BorderThicknessProperty));
      elemFactory.SetValue(Border.BorderBrushProperty, new TemplateBindingExtension(Border.BorderBrushProperty));
      elemFactory.SetValue(Border.BackgroundProperty, new TemplateBindingExtension(Panel.BackgroundProperty));
      elemFactory.SetValue(Border.NameProperty, "DGR_Border");
      elemFactory.SetValue(Border.SnapsToDevicePixelsProperty, true);

      var cellsPresenterFactory = new FrameworkElementFactory(typeof(DataGridCellsPresenter));
      cellsPresenterFactory.SetValue(DataGridCellsPresenter.ItemsPanelProperty, new TemplateBindingExtension(ItemsControl.ItemsPanelProperty));
      cellsPresenterFactory.SetValue(DataGridCellsPresenter.SnapsToDevicePixelsProperty, new TemplateBindingExtension(UIElement.SnapsToDevicePixelsProperty));

      //elemFactory.AppendChild(selectiveScrollingGridFactory);

      templateButton.VisualTree = elemFactory;
      elemFactory.AppendChild(new FrameworkElementFactory(typeof(ContentPresenter)));

【问题讨论】:

    标签: wpf wpfdatagrid code-behind


    【解决方案1】:

    只需创建另一个FrameworkElementFactory,其类型为System.Windows.Controls.Primitives.SelectiveScrollingGrid

    ...
    var selectiveScrollingGridFactory = new FrameworkElementFactory(typeof(System.Windows.Controls.Primitives.SelectiveScrollingGrid));
    elemFactory.AppendChild(selectiveScrollingGridFactory);
    
    var cellsPresenterFactory = new FrameworkElementFactory(typeof(DataGridCellsPresenter));
    cellsPresenterFactory.SetValue(DataGridCellsPresenter.ItemsPanelProperty, new TemplateBindingExtension(ItemsControl.ItemsPanelProperty));
    cellsPresenterFactory.SetValue(DataGridCellsPresenter.SnapsToDevicePixelsProperty, new TemplateBindingExtension(UIElement.SnapsToDevicePixelsProperty));
    
    selectiveScrollingGridFactory.AppendChild(selectiveScrollingGridFactory);
    ...
    

    请注意,以编程方式创建模板的推荐方法是使用 XamlReader 类的 Load 方法从 string 或内存流加载 XAML,如 MSDN 上的文档中所述:https://msdn.microsoft.com/en-us/library/system.windows.frameworkelementfactory(v=vs.110).aspx

    【讨论】:

    • 感谢您的 cmets,我现在在 XAML 中定义了样式,然后在代码隐藏中加载它,这对我来说是完美的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2019-04-11
    相关资源
    最近更新 更多