访问存储在资源中的模板属性

时间:2017-08-01 06:46:31

标签: c# wpf devexpress resourcedictionary gridcontrol

我有一个派生的devexpress网格控件,它为指标行设置了一些模板:

<dxg:GridControl.Resources>
    <sys:Double x:Key="{dxgt:TableViewThemeKey ResourceKey=IndicatorWidth, ThemeName=Office2016White}">300</sys:Double>

    <DataTemplate x:Key="{dxgt:RowIndicatorThemeKey ResourceKey=RowTemplate, ThemeName=Office2016White}">
      <Grid Name="IndicatorGrid">
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="35" Name="IndicatorColumnRowNumber" SharedSizeGroup="RowNumberGroup" />
          <ColumnDefinition Width="200" Name="IndicatorColumnDescription" SharedSizeGroup="DescriptionGroup" />
          <ColumnDefinition Width="200" Name="IndicatorColumnSource" SharedSizeGroup="SourceGroup" />
        </Grid.ColumnDefinitions>
        //...
    </DataTemplate>
</dxg:GridControl.Resources>

现在指标列的宽度固定为300.现在我希望行的宽度由第二部分中定义的列计算。我知道我也可以通过后面的代码访问视图的指标宽度但是我无法访问后面代码中的模板控件

var view = ((TableView)this.View);
view.IndicatorWidth = IndicatorColumnRowNumber.Width /* can not be found */ + ...

因为他们住在xaml的资源中。据我所知,这也不应该发生。实现这个的最佳方法是什么?也许在后面的代码中提取定义?

修改 这是表格的图片

table

1 个答案:

答案 0 :(得分:0)

我不是100%确定你想要实现的目标,但是如果你想在代码中访问你的资源,你可以这样做:

XAML:

<Grid x:Name="MyGrid">
    <Grid.Resources>
        <DataTemplate x:Key="MyResource">
            <TextBlock Text="Hello"></TextBlock>
        </DataTemplate>
    </Grid.Resources>
</Grid>

代码背后:

public MainWindow()
    {
        InitializeComponent();

        var resource = MyGrid.Resources["MyResource"];
        var dataTemplate = (DataTemplate) resource;
    }

您可以使用其他工具来获取任何已定义的资源。 FrameworkElement.FindResource和FrameworkElement.TryFindResource方法将从您指定的元素和可视树中搜索资源,直到主应用程序并包括您已设置的任何主题。来自MS参考:

FrameworkElement.FindResource documentation

另请注意,Resources字典和FindResource方法接受对象键(不是字符串)。这适合您的情况,因为您的密钥是RowIndicatorThemeKey对象。您可以实例化这样的对象并将ResourceKey属性设置为“RowTemplate”值并搜索您的资源。

通常,可以在不需要代码的情况下实现诸如此类问题的解决方案,如果您提供更多信息,也许我们可以找到基于绑定的解决方案。