gpt4 book ai didi

c# - 为什么这个数据绑定(bind)不改变 GridUnitType?

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:23 27 4
gpt4 key购买 nike

我的目标是保存一个 GridSplitter 位置供以后调用。拆分器位于 Grid 控件内,该控件具有三个定义的列:

<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding GridPanelWidth, Mode=TwoWay}" />
<ColumnDefinition Width="3" /> <!--splitter itself is in this column-->
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>

属性 GridPanelWidth 在 View 模型中是这样定义的:

private GridLength _gridPanelWidth = new GridLength(1, GridUnitType.Star);
public GridLength GridPanelWidth
{
get { return _gridPanelWidth; }
set
{
if (_gridPanelWidth != value)
SetProperty(ref _gridPanelWidth, value, () => GridPanelWidth);
}
}

我遇到的问题是,当拆分器移动时,绑定(bind)仅更新绑定(bind)属性的 Double (Value) 组件,而不更新 GridUnitType 部分

示例:属性默认为 1*。用户拖动拆分器,值变为 354*,而不仅仅是 354。那么,在恢复该值时,它是巨大的(354 倍,而不是 354 像素)。

为什么会这样,你会怎么做?

最佳答案

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding GridPanelWidth, Mode=TwoWay}" />
<ColumnDefinition Width="4" />
<!--splitter itself is in this column-->
<ColumnDefinition x:Name="RightColumn" Width="2*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<Border
BorderBrush="Gray"
BorderThickness="1"
Grid.Column="0"
Grid.Row="0"
/>

<GridSplitter
Background="SteelBlue"
ResizeBehavior="PreviousAndNext"
ResizeDirection="Columns"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
ShowsPreview="False"
Grid.Column="1"
Grid.Row="0"
/>

<Border
BorderBrush="Gray"
BorderThickness="1"
Grid.Column="2"
Grid.Row="0"
/>

<StackPanel
Grid.Row="1"
Grid.ColumnSpan="3"
Grid.Column="0"
>
<TextBlock>
<Run>GridPanelWidth: </Run>
<Run Text="{Binding GridPanelWidth.Value, Mode=OneWay}" />
<Run Text="{Binding GridPanelWidth.GridUnitType, Mode=OneWay}" />
</TextBlock>
<TextBlock>
<Run>RightColumn.Width: </Run>
<Run Text="{Binding Width.Value, ElementName=RightColumn, Mode=OneWay}" />
<Run Text="{Binding Width.GridUnitType, ElementName=RightColumn, Mode=OneWay}" />
</TextBlock>
</StackPanel>
</Grid>

截图一:

enter image description here

截图2:

enter image description here

截图3:

enter image description here

Res ipsa loquitor,就我而言,但只是为了安全起见:

因为父级可能会调整大小,网格拆分器会更改两列之间的比例,同时为每一列保留 GridUnitType.Star,以便在调整父级大小时,比例自然会保持不变持续的。这保留了 XAML 中初始宽度值的意图。

左列的

Width.Value 结果与左 Border 的 ActualWidth 相同,右列也是如此。您必须同时捕获两者并保存比率。

更新

我发现 Grid/GridSplitter 对于日常使用有点过度设计,而我想要的只是另一个导航 Pane ,所以我最近写了一个 SplitterControl 具有两个内容属性,并在模板中使用样式设置网格和拆分器。我还没有抽出时间让分流比保持不变,所以我现在就这么做了。

我做的是相当痛苦的,因为控件是可配置的,代码也不是那么好,但如果你有兴趣,我可以分享。

业务端很简单:

当列调整大小时,设置一个标志来阻止递归和

PaneRatio = _PART_ContentColumn.Width.Value / _PART_NavColumn.Width.Value;

PaneRatio 更改时,如果它不是由列大小更改处理程序设置的

_PART_NavColumn.Width = new GridLength(1, GridUnitType.Star);
_PART_ContentColumn.Width = new GridLength(PaneRatio, GridUnitType.Star);

在实践中,导航器/内容列可以交换,或者它们可以是行。这两者都是通过在作为拆分控件模板的子级的 HeaderedContentControl 上切换模板来完成的。

关于c# - 为什么这个数据绑定(bind)不改变 GridUnitType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187057/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com