我的目标是让控件在窗口中可用大小,但目前我的可用大小是无穷大。在最顶层,我有一个带有图形查看器的窗口。
<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 中控件上的某些属性。