1

我的目标是让控件在窗口中可用大小,但目前我的可用大小是无穷大。在最顶层,我有一个带有图形查看器的窗口。

<Window x:Class="WpfExperimental.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:wpfExp="clr-namespace:WpfExperimental"
  Title="Window1" Height="900" Width="900">

  <wpfExp:GraphViewer/>
</Window>

在 graphviewer 中,在停靠面板中有一个工具栏和一个树视图,三个中的任何一个都没有设置大小

<DockPanel x:Name ="maindockpanel"
             LastChildFill="True">
   <Toolbartray />
   <Treeview />

我为包含网格的树视图定义了一个控制模板(最初是一个堆栈面板,但我将其更改为网格只是为了更确定发生了什么)。

    <ControlTemplate TargetType="TreeView">
        <ScrollViewer 
            Focusable="False"
            CanContentScroll="False"
            Padding="4">
          <Grid>
            <Grid.RowDefinitions>
              <RowDefinition Height="Auto"/>
              <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid Grid.Row="0">
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="19" />
                <ColumnDefinition x:Name="SignalNamesColumnDefinition" Width="200" />
                <ColumnDefinition Width="*" />
              </Grid.ColumnDefinitions>
              <wpfExp:SignalNameBox x:Name="TreeViewTimeTextBox" Grid.Column="1"
                  Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"
                  MainText="Time" 
                />
              <wpfExp:SignalGraphAxis Grid.Column="2"
                  PenColor="{Binding ElementName=GraphColorPicker, Path=SelectedColor, Mode=OneWay}"
                  Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"                
                  PenWidth="{Binding ElementName=graph_viewer, Path=GraphPenWidth, Mode=OneWay}"
                  X_Scale="{Binding ElementName=graph_viewer, Path=X_Scale, Mode=OneWay}"
                  MaxTimeValue="{Binding ElementName=graph_viewer, Path=_SignalDataViewModel.MaxTimeValue, Mode=OneWay}"
                />
            </Grid>
            <ItemsPresenter Grid.Row="1" />
          </Grid>
        </ScrollViewer>

DataTemplate 被应用到上述控件模板中的 ItemsPresenter。

<TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource ="{Binding Path = bits}">
          <Grid x:Name="graph_viewer_grid" Background="Black">
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="200" />
              <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <wpfExp:SignalNameBox Grid.Column="0"
              Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"
              x:Name="signal_name_panel"
              MainText="{Binding Path = SignalName}" 
            />
            <wpfExp:SignalGraph Grid.Column="1"
              x:Name="signal_graph"
              IsSignal="True"
              BusTextColor="{Binding ElementName=BusTextColorPicker, Path=SelectedColor, Mode=OneWay}"
              GraphPenColor="{Binding ElementName=GraphColorPicker, Path=SelectedColor, Mode=OneWay}"
              Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"
              PenWidth="{Binding ElementName=graph_viewer, Path=GraphPenWidth, Mode=OneWay}"
              Signal="{Binding}" 
              signal_graph_window_width="{Binding ElementName=graph_viewer, Path=signal_graph_window_width, Mode=OneWay}"
              X_Scale="{Binding ElementName=graph_viewer, Path=X_Scale, Mode=OneWay}"
              MaxTimeValue="{Binding RelativeSource = {RelativeSource AncestorType={x:Type wpfExp:GraphViewer}}, Path = _SignalDataViewModel.MaxTimeValue}"
              />

          </Grid>
          <HierarchicalDataTemplate.ItemTemplate>
            <DataTemplate>
              <Grid Background="Black">
                <Grid.ColumnDefinitions>
                  <ColumnDefinition MinWidth="200"/>
                  <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <wpfExp:SignalNameBox Grid.Column="0"
                  Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"
                  x:Name="signal_name_panel"
                  MainText="{Binding Path = BitNumber}" 
                />

                <wpfExp:SignalGraph Grid.Column="1"
                  x:Name="signal_graph"
                  IsSignal="False"
                  BusTextColor="{Binding ElementName=BusTextColorPicker, Path=SelectedColor, Mode=OneWay}"
                  GraphPenColor="{Binding ElementName=GraphColorPicker, Path=SelectedColor, Mode=OneWay}"
                  Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"
                  PenWidth="{Binding ElementName=graph_viewer, Path=GraphPenWidth, Mode=OneWay}"
                  Bit="{Binding}" 
                  signal_graph_window_width="{Binding ElementName=graph_viewer, Path=signal_graph_window_width, Mode=OneWay}"
                  X_Scale="{Binding ElementName=graph_viewer, Path=X_Scale, Mode=OneWay}"
                  MaxTimeValue="{Binding RelativeSource = {RelativeSource AncestorType={x:Type wpfExp:GraphViewer}}, Path = _SignalDataViewModel.MaxTimeValue}"
                />

              </Grid>
            </DataTemplate>
          </HierarchicalDataTemplate.ItemTemplate>

我不明白为什么我得到无限空间,我认为我已经为网格设置了所有大小,或者 * 表示占用可用空间。哪个应该(我认为)占用窗口中的 900*900 空间,将其分配到实际大小,然后将其作为可用大小提供给其子级。真的很迷茫。任何帮助表示赞赏。

编辑:好的,是的,这是滚动查看器如何将无限宽度和高度传递给其控件中的子项的问题。

那么我应该如何进行。

所以我希望我的控件知道滚动查看器在进行测量和排列时占用的实际空间。基本上我想让自定义控件的大小更大的数据乘以它的比例或屏幕上的实际大小。

我希望只是通过控制可用大小。但如果不是,那么只找到可视父滚动查看器并获取其物理大小是否正确?我看到的问题是滚动查看器在测量期间不会有实际大小。哦等等,即使没有设置实际的宽度和高度,它也应该设置宽度和高度。所以我想我只是使用它。仅在代码后面搜索滚动查看器是正确的做法,还是应该将其绑定到 xaml 中控件上的某些属性。

4

1 回答 1

2

好吧,你有一个ScrollViewer. 它的全部目的是为孩子们提供无限的大小。

设置CanContentScroll告诉ScrollViewer它的孩子是否知道如何实现逻辑滚动MSDN有更多信息。

如果你想禁用水平滚动,你应该设置HorizontalScrollbarVisibility="Disabled". 垂直滚动也有类似的属性。

禁用指示方向的滚动将为您提供固定大小。但是,如果您从不想要无限的布局空间,为什么不ScrollViewer从模板中删除呢?

问题编辑后编辑

听起来您正在尝试实现最小比例乘数,以便始终尽可能多地填充视口。我认为这可能应该发生在您的控制措施步骤之外。如果是这样,那么您绝对可以绑定到ScrollViewer'sActualHeightActualWidth属性来管理最小比例。

由于修改比例会导致控件的新布局,每次ScrollViewer调整大小时都会有一个额外的布局传递,但这听起来还不错。

于 2013-07-05T21:05:25.243 回答