资源控制上的基本XAML控件

时间:2013-10-04 14:20:40

标签: wpf xaml resourcedictionary

是否可以在参考资料中定义的控件上建立一个或多个控件。这样控件就可以从基本控件继承大多数属性。类似于Style方法但由于某种原因我不能使用事件/事件集(在这种情况下为AutoGeneratingColumns),我得到的错误是“xy-Event不是路由事件”

这是我想要完成的一个例子。 我有数据网格,其中大多数属性是相同的

<DataGrid x:Name="gridEditSystem"
           AutoGeneratingColumn="onGridEditSystem_autoGeneratingColumn"
           SelectionUnit="Cell"
           SelectionMode="Single" CellStyle="{StaticResource GridEditStyle}">
</DataGrid>

<DataGrid x:Name="gridEditPlanets" SelectedCellsChanged="gridEditPlanets_SelectedCellsChanged"
           AutoGeneratingColumn="onGridEditSystem_autoGeneratingColumn"
           SelectionUnit="Cell"
           SelectionMode="Single" CellStyle="{StaticResource GridEditStyle}">
</DataGrid>

我现在想要的是“基础控制”

<Window.Resources>
    <DataGrid x:Key="BaseDataGrid" AutoGeneratingColumn="onGridEditSystem_autoGeneratingColumn"
              SelectionMode="Single" SelectionUnit="Cell"
              CellStyle="{StaticResource GridEditStyle}">
    </DataGrid>
</Window.Resources>

继承控制

 <DataGrid x:Name="gridEditSystem"
           BasedOn/Inherits/Templates={StaticResource BaseDataGrid}
 </DataGrid>

 <DataGrid x:Name="gridEditPlanets" 
           BasedOn/Inherits/Templates={StaticResource BaseDataGrid}
 </DataGrid>

我尝试了一些组合,但到目前为止失败了,我在谷歌上找不到任何东西。这在XAML中是否可行?

1 个答案:

答案 0 :(得分:0)

你不能那样做,但是在WPF中,你可以通过多种方式解决这个问题。

您可以使用所有常用属性进行自定义网格控件,并使用它而不是常规DataGrid控件。

    public class BaseDataGrid : DataGrid
    {
        protected override void OnInitialized(EventArgs e)
        { 
             base.OnInitialized(e);

             // Set all you common properties here
             SelectionUnit = DataGridSelectionUnit.Cell;
             SelectionMode = DataGridSelectionMode.Single;
             CellStyle = FindResource("GridEditStyle") as Style;
         }
    }
你的xaml

中的

        <local:BaseDataGrid x:Name="gridEditSystem"/>
        <local:BaseDataGrid x:Name="gridEditPlanets"/>

您还可以使用所有常用属性制作行为,并将其附加到您想要的DataGrid

     public class BaseGridBehavior : Behavior<DataGrid>
     {
        protected override void OnAttached()
        {
            AssociatedObject.Initialized += AssociatedObject_Initialized;

             base.OnAttached();
        }

        void AssociatedObject_Initialized(object sender, EventArgs e)
        {
            // Set all you common properties here
            AssociatedObject.SelectionUnit = DataGridSelectionUnit.Cell;
            AssociatedObject.SelectionMode = DataGridSelectionMode.Single;
            AssociatedObject.CellStyle = AssociatedObject.FindResource("GridEditStyle") as Style;
        }
    }

和xaml:

        <DataGrid x:Name="gridEditSystem">
            <i:Interaction.Behaviors>
                <local:BaseGridBehavior/>
            </i:Interaction.Behaviors>
        </DataGrid>
        <DataGrid x:Name="gridEditPlanets">
            <i:Interaction.Behaviors>
                <local:BaseGridBehavior/>
            </i:Interaction.Behaviors>
        </DataGrid>

这需要您包含并引用System.Windows.Interactivity dll

希望这有帮助