gpt4 book ai didi

c# - 使用 MVVM 检索元素的大小

转载 作者:行者123 更新时间:2023-11-30 16:05:15 26 4
gpt4 key购买 nike

我有两个文本框详细说明 Canvas 上某物的位置,只是我希望文本框中的值是 0 到 1 范围内的数字,表示宽度/高度的百分比。

我需要知道如何将该百分比转换为 margin 值。但是,我不确定如何在不破坏 MVVM 模式并从 ViewModel 访问“ Canvas ”以获取其大小的情况下执行此操作。

例如,如果 Canvas 宽度为 100,X 位置为 0.1,那么我需要的左边距为 10。

我考虑过使用命令并将 Canvas 宽度/高度作为事件参数发送,但我不确定将其绑定(bind)到哪里。

XAML

<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="Position" Width="75"/>
<TextBox Height="25" Width="50"
Text="{Binding Path=X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Height="25" Width="50"
Text="{Binding Path=Y, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>

<Grid Height="300" Width="550">
<TextBlock FontSize="18" FontFamily="Arial"
Opacity="{Binding Path=Opacity}"
Margin="{Binding Position}">
</TextBlock>
</Grid>

View 模型

public double X
{
get { return Model.Position.X; }
set
{
if (Model.Position.X != value)
{
Model.Position = new Point(value, Model.Position.Y);
OnPropertyChanged("Position");
}
}
}

public double Y
{
get { return Model.Position.Y; }
set
{
if(Model.Position.Y != value)
{
Model.Position = new Point(Model.Position.X, value);
OnPropertyChanged("Position");
}
}
}

public Thickness Position
{
get { return new Thickness(Model.Position.X, Model.Position.Y, 0, 0); }
}

最佳答案

解决方案是使用 MultiBinding 将所需信息作为值发送:

<Setter Property="Margin">
<Setter.Value>
<MultiBinding Converter="{StaticResource MyMultiConverter}">
<Binding Path="X"/>
<Binding Path="Y"/>
<Binding ElementName="Canvas" Path="ActualWidth"/>
<Binding ElementName="Canvas" Path="ActualHeight"/>
</MultiBinding>
</Setter.Value>
</Setter>

MyMultiConverter 然后实现 IMultiValueConverter 并返回一个 Thickness

关于c# - 使用 MVVM 检索元素的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33961066/

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