- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的目标是保存一个 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>
截图一:
截图2:
截图3:
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/
这种星型单位如何运作?我读过msdn definition .但无法真正了解它如何定义对象的大小。 最佳答案 * 尺寸会自动按比例调整尺寸。因此,例如,如果您有一个宽度为 * 的列和另一个宽度为 *
我的目标是保存一个 GridSplitter 位置供以后调用。拆分器位于 Grid 控件内,该控件具有三个定义的列: 属性 GridPanelWidth 在 Vi
谁能解释一下使用之间的区别: GridLength length = new GridLength(0, GridUnitType.Auto) 和 GridLength length = new
我是一名优秀的程序员,十分优秀!