【问题标题】:WPF how to make Grid Reevaluate Max Widths on GridSplitter Column Resize?WPF如何使网格重新评估GridSplitter列调整大小的最大宽度?
【发布时间】:2014-03-14 22:32:04
【问题描述】:

所以我有这个带有一堆列定义的网格。初始列宽属性是从应用程序的设置中初始化的,它可以正常工作,然后我尝试为列设置一个最大大小,以便用户无法调整屏幕大小,从而使内容无法正确显示。

用于计算最大宽度的多重绑定似乎工作正常。但是,我遇到的问题是,当 gridsplitter 更改实际宽度的值时,多重绑定不会重新计算 MaxWidth 的值。我在转换器内部设置了一个断点,但没有命中。

但是,我不明白这是怎么回事,因为根据 GridSplitter 的文档:

http://msdn.microsoft.com/en-us/library/system.windows.controls.gridsplitter%28v=vs.110%29.aspx

使用 gridsplitter 调整大小应该会改变 columndefinition 的实际宽度。

如果是这种情况,那么我希望多重绑定能够更新。但是,我没有看到这个。

  <Grid.ColumnDefinitions>
  <ColumnDefinition 
      x:Name="NameListViewColumn"
      MinWidth="100"
      Width="{Binding NameListViewWidth, Source={x:Static DaedalusGraphViewer:SettingsManager.AppSettings}, Mode=OneTime,
                      Converter={StaticResource GridLengthConverter}}"              
      >
    <ColumnDefinition.MaxWidth>
      <MultiBinding Converter="{StaticResource SignalNameColumnMaxSizeConverter}">
        <Binding Path="ActualWidth" 
                 ElementName="NameListViewColumn"
                 />
        <Binding Path="ActualWidth" 
                 ElementName="SignalValuesListViewColumn"
                 />
       <Binding Path="ActualWidth" 
                ElementName="SignalTreeViewColumn"
                />

        <Binding ElementName="SignalValuesListViewColumn" Path="MinWidth" />
        <Binding ElementName="SignalTreeViewColumn" Path="MinWidth" />

      </MultiBinding>
    </ColumnDefinition.MaxWidth>

  </ColumnDefinition>
    <ColumnDefinition Width="Auto" x:Name="SignalNamesGridSpitter"/>
  <ColumnDefinition 
      MinWidth="100"
      x:Name="SignalValuesListViewColumn"
      Width="{Binding SignalValuesListViewWidth, Source={x:Static DaedalusGraphViewer:SettingsManager.AppSettings}, 
                      Mode=OneTime, Converter={StaticResource GridLengthConverter}}"
      >
    <ColumnDefinition.MaxWidth>
      <MultiBinding Converter="{StaticResource SignalValuesMaxSizeConverter}">
        <Binding Path="ActualWidth" 
                 ElementName="SignalValuesListViewColumn"
                 />
        <Binding Path="ActualWidth" 
                 ElementName="SignalTreeViewColumn"
                 />


        <Binding ElementName="SignalTreeViewColumn" Path="MinWidth" />

      </MultiBinding>
    </ColumnDefinition.MaxWidth>
  </ColumnDefinition>
    <ColumnDefinition x:Name="SignalValuesGridSplitter" Width="Auto"/>
    <ColumnDefinition 
      x:Name="SignalTreeViewColumn"
      MinWidth="100"
      Width="*"
      />
    <ColumnDefinition Width="18" MinWidth="18" x:Name="VerticalScrollBarColumn"/>
  </Grid.ColumnDefinitions>

【问题讨论】:

  • 第一次加载视图时是否在转换器中打断点?
  • 是的,它是第一次计算,只是当实际宽度发生变化时它不会重新计算

标签: c# wpf xaml gridsplitter


【解决方案1】:

在这里找到答案:基本上实际的宽度属性没有实现 INotifyPropertyChanged。

Binding to ColumnDefinition.ActualWidth returns 0

【讨论】:

    【解决方案2】:

    MaxWidth="{Binding ElementName=SignalValuesGridSplitter,Path=ActualWidth}" TextWrapping="Wrap"/>

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 2013-07-17
      • 2017-09-17
      • 2012-03-24
      • 1970-01-01
      • 2017-08-07
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多