WPF 中网格(或控件)的装订边距
Binding margin of a grid (or a control) in WPF
我想绑定一些控件的边距,比方说,一个按钮:
<Window.Resources>
<local:MarginConverter x:Key="marginConverter1"/>
</Window.Resources>
<Grid HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="{Binding MyThickness,
Converter={StaticResource marginConverter1}}">
<Button>Button1</Button>
</Grid>
根据参考文献。这里:SO: Binding a part of the margin,我创建了一个 MarginConverter
class 和一个 MyDataContext
class 来实现 INotifyPropertyChanged
接口(见下文),但是 Button1
保持在左上角位置(就好像它的边距是 0)。
Public Class MyDataContext
Implements INotifyPropertyChanged
Private _myThickness As Thickness = New Thickness(20, 10, 20, 0)
Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged
Private Sub OnPropertyChanged(propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
Public Property MyThickness As Thickness
Get
Return _myThickness
End Get
Set(value As Thickness)
_myThickness = value
OnPropertyChanged("MyThickness")
End Set
End Property
End Class
后面的代码:
Dim myDataContext1 As New MyDataContext()
Private Sub Window1_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
myDataContext1.MyThickness = New Thickness(20, 150, 20, 0)
End Sub
请帮助我澄清我的误解,即使是基本知识或清晰的解释,我们将不胜感激!
P/S: 我绑定上边距的目的是当用户执行某些特定任务时,window 顶部会出现一个 25 高的边框,所以所有现有的控件都必须关闭。
因此,如果您有其他方法,请在此处分享。谢谢。
如果您只想在网格顶部动态提供 25 的高度,
您可以通过在网格的顶行添加边框并将其可见性更改为 "Collapsed" 到 "visible" 来实现。
<Grid HorizontalAlignment="Left" VerticalAlignment="Top">
<StackPanel>
<Border Height="25" Visibility="Collapsed">
</Border>
<Button >Button1</Button>
</StackPanel>
</Grid>
好的,这里是为你工作的例子,抱歉,但仅限于 C#
app.xaml
<Application.Resources>
<ResourceDictionary>
<viewModel:TestVM x:Key="TestVm"/>
</ResourceDictionary>
</Application.Resources>
视图模型
public class TestVM : INotifyPropertyChanged
{
Thickness myThickness = new Thickness(20,10,20,0);
public Thickness MyThickness
{
get { return myThickness; }
set { myThickness = value; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Window1.xaml
<Window x:Class="WPF_Test_Canvas_Chart.Windows.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPF_Test_Canvas_Chart.Windows"
mc:Ignorable="d"
DataContext="{StaticResource TestVm}"
Title="Window1" Height="300" Width="300">
<Grid HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="{Binding MyThickness}">
<Button>Button1</Button>
</Grid>
</Window>
Window1.cs
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
var data = this.DataContext as TestVM;
data.MyThickness = new Thickness(100,10,20,0);
}
}
我想绑定一些控件的边距,比方说,一个按钮:
<Window.Resources>
<local:MarginConverter x:Key="marginConverter1"/>
</Window.Resources>
<Grid HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="{Binding MyThickness,
Converter={StaticResource marginConverter1}}">
<Button>Button1</Button>
</Grid>
根据参考文献。这里:SO: Binding a part of the margin,我创建了一个 MarginConverter
class 和一个 MyDataContext
class 来实现 INotifyPropertyChanged
接口(见下文),但是 Button1
保持在左上角位置(就好像它的边距是 0)。
Public Class MyDataContext
Implements INotifyPropertyChanged
Private _myThickness As Thickness = New Thickness(20, 10, 20, 0)
Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged
Private Sub OnPropertyChanged(propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
Public Property MyThickness As Thickness
Get
Return _myThickness
End Get
Set(value As Thickness)
_myThickness = value
OnPropertyChanged("MyThickness")
End Set
End Property
End Class
后面的代码:
Dim myDataContext1 As New MyDataContext()
Private Sub Window1_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
myDataContext1.MyThickness = New Thickness(20, 150, 20, 0)
End Sub
请帮助我澄清我的误解,即使是基本知识或清晰的解释,我们将不胜感激!
P/S: 我绑定上边距的目的是当用户执行某些特定任务时,window 顶部会出现一个 25 高的边框,所以所有现有的控件都必须关闭。 因此,如果您有其他方法,请在此处分享。谢谢。
如果您只想在网格顶部动态提供 25 的高度, 您可以通过在网格的顶行添加边框并将其可见性更改为 "Collapsed" 到 "visible" 来实现。
<Grid HorizontalAlignment="Left" VerticalAlignment="Top">
<StackPanel>
<Border Height="25" Visibility="Collapsed">
</Border>
<Button >Button1</Button>
</StackPanel>
</Grid>
好的,这里是为你工作的例子,抱歉,但仅限于 C# app.xaml
<Application.Resources>
<ResourceDictionary>
<viewModel:TestVM x:Key="TestVm"/>
</ResourceDictionary>
</Application.Resources>
视图模型
public class TestVM : INotifyPropertyChanged
{
Thickness myThickness = new Thickness(20,10,20,0);
public Thickness MyThickness
{
get { return myThickness; }
set { myThickness = value; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Window1.xaml
<Window x:Class="WPF_Test_Canvas_Chart.Windows.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPF_Test_Canvas_Chart.Windows"
mc:Ignorable="d"
DataContext="{StaticResource TestVm}"
Title="Window1" Height="300" Width="300">
<Grid HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="{Binding MyThickness}">
<Button>Button1</Button>
</Grid>
</Window>
Window1.cs
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
var data = this.DataContext as TestVM;
data.MyThickness = new Thickness(100,10,20,0);
}
}