仅绑定WPF控件的部分margin属性
我有这个:
<TabControl Margin="0,24,0,0">...</TabControl>
我只想绑定 TabControl 的 "Top"
部分,直观上我会这样做:
<TabControl Margin="0,{Binding ElementName=TheMenu, Path=Height},0,0">
...
</TabControl>
我该怎么做?
I have this:
<TabControl Margin="0,24,0,0">...</TabControl>
I want to bind only the "Top"
part of the TabControl, which intuitively I would do it this way:
<TabControl Margin="0,{Binding ElementName=TheMenu, Path=Height},0,0">
...
</TabControl>
How do I do it ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您尝试过使用这样的转换器吗?
在 VB.Net 中
或在 C# 中
XAML
编辑:
使用 MultiConverter
还可以在运行时获取所有四个值并使用 MultiValueConverter。 厚度对象的顶级属性不是依赖对象,因此您无法定义对其的绑定(除非您的源不是依赖对象)。
XAML
...和 c#
编辑(2)反向绑定:
我不确定这是否会让你高兴。以我的拙见,我会尽力避免这种情况,但是好吧...如果您的源是依赖属性,您可以将其绑定到边距:
但我对此有一些影响。
诀窍是,您不要将 TabControl 的 Margin 的一部分绑定到“其他内容”,而是将“其他内容”绑定到 TabControl 的 Margin 并指定 Binding-Mode OneWayToSource。
Have you tried using a converter like this?
in VB.Net
Or in C#
XAML
Edit:
Using a MultiConverter
It is also possible to get all four values during run-time and use a MultiValueConverter. The Top-Property of the Thickness-Object is not a Dependency-Object, therefor you can't define a binding to it (unless your source is not a Dependency-Object).
XAML
... and c#
Edit(2) Reverse-Binding:
I'm not sure if this will make you happy. In my humble opinion I would try to avoid this, but ok... If your source is a Dependency-Property, you can bind this to the Margin:
But I've got some effects with this.
The trick is, that you do not bind a part of the Margin of your TabControl to "something else", but bind "something else" to the Margin of your TabControl and specify Binding-Mode OneWayToSource.
实际上,控件的
Margin
属性是Thickness
类型。因此,如果类型为 Thickness,我们可以将其绑定到 Property。您也可以设置厚度对象的一部分。就像 -
在
Xaml
中,我们可以将此属性直接绑定到任何元素的 margin 属性..就像这样..Actually
Margin
property of a control is ofThickness
Type. So we can bind it to Property if type Thickness.and You can set a part of a Thickness object too. Like -
and in
Xaml
we can bind this property directly to margin property of any element..like this..您可以尝试类似 这个来自另一个问题的答案。
该解决方案使用允许 XAML 的附加属性,如下所示:
附加属性也由 DependencyObject 支持,因此数据绑定将起作用。
You could try something like this answer from another question.
The solution uses an attached property that allows for XAML like the following:
The attached property is also backed by a DependencyObject so data binding will work.
我仅在 StackPanel 中使用此解决方法来处理左边距。好处是你不需要任何转换器。
预览
I have used this workaround for left margin only with StackPanel. Benefit is that you don't need any Converter.
preview
从您的代码中,我认为您的菜单和 tabControl 可能重叠,因此您想使用边距将它们分开。我感觉这种做法就像两列CSS布局。
回到正题,我认为您可以将
TranslateFransform
应用于TabControl.RenderTransform
。您可以绑定Y
属性。From your code, I figure that your menu and tabControl may overlap, so you want to use margin to separate them. I feel this practice like two Column CSS Layout.
Back to the point, I think you can apply
TranslateFransform
toTabControl.RenderTransform
. You can bindY
property.如果您不附加到另一个 WPF 元素,则要扩展 Ioop 的方法来控制边距而不是转换器,
创建 4 个标准属性和一个只读属性,如下所示 -
然后您只需添加
XAML
-然后在 WPF 窗口后面的代码上
- 从那里您可以使用任何您想要的控件来分别更改所有 4 个边距,并且
Class
可重用于其他控件。To expand on Ioop's method of making a property to control margin instead of a converter if you aren't attaching to another WPF element:
Create 4 standard properties and a readonly property, like so-
Then you just have to add the
XAML
-Then on the code behind on the WPF window-
From there you can use whatever control you desire to change all 4 margins separately and the
Class
is reusable for other controls.好吧,它很旧,但我一直在寻找更好的方法:
Ok it is old, but I was searching for a nicer way: