【问题标题】:Access template properties which are stored in resources访问存储在资源中的模板属性
【发布时间】:2017-08-01 06:46:31
【问题描述】:

我有一个派生的 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 中的资源中。据我了解,这也不应该发生。实现这一点的最佳方法是什么?也许提取后面代码中的定义?

编辑: 这是一张桌子的照片

【问题讨论】:

    标签: c# wpf devexpress resourcedictionary gridcontrol


    【解决方案1】:

    我不是 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”值,然后像这样搜索您的资源。

    一般来说,像你这样的问题的解决方案可以在不需要代码的情况下实现,如果你提供更多信息,也许我们可以找到基于绑定的解决方案。

    【讨论】:

    • 感谢您的意见。我很想在 XAML 中这样做。我试图改写它:总指标列设置在第一个资源条目中。我希望它与所有列相同(当前为 435,但它想将其设置为“自动”)
    • 您可以绑定到元素“IndicatorGrid”及其 ActualWidth 属性:`{Binding Path=ActualWidth, ElementName=IndicatorGrid}'
    • 但我想反过来:网格应该定义所需的大小,然后相应地采用指标宽度
    • 我明白了。问题是您不能绑定到 ColumnDefinition 的 Width 属性。相反,您可以使用星号语法。在您的情况下,您希望后两列的宽度约为第一列的 6 倍,因此您可以将第一列的宽度指定为 * 和另外两列的 6*。现在,指标网格将自动占用所有空间(如果在模板中正确定位),列将在所有可用空间中扩展,同时保持您的比率
    • 我不想绑定在 xaml 中定义的列的宽度(如我的问题中所述)。视图的整体属性IndicatorWidth 需要相同大小,否则您无法看到所有列或右侧会有空白空间
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2020-10-21
    • 2020-05-15
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多