我目前正在将旧的典型代码隐藏用户控件中的操纵杆用户控件重写为 MVPVM WinUI 3,并且在从演示者类引用 UIElement 时遇到问题。是的,我知道您不应该引用演示者的 UI。只需要有关如何重写它的帮助。 Presenter 类中的 ControlArea 是我遇到问题的地方。谁能告诉我如何重写这两行?
View UI代码是:
<Ellipse
x:Name="ControlArea"
Height="{x:Bind p.ViewModel.OuterDiameter}"
Width="{x:Bind p.ViewModel.OuterDiameter}"
Fill="{x:Bind p.ViewModel.OuterFill}"
Stroke="{x:Bind p.ViewModel.OuterStroke}"/>
Presenter类方法是:
void OnPointerMoved(object sender, PointerRoutedEventArgs eventArgs)
{
if (!ViewModel.ControllerPressed) return;
Double x = eventArgs.GetCurrentPoint(ControlArea).Position.X - ViewModel.ControlRadius;
Double y = eventArgs.GetCurrentPoint(ControlArea).Position.Y - ViewModel.ControlRadius;
double disp = Math.Sqrt(x * x + y * y);
if (disp < ViewModel.ControlRadius)
{
ViewModel.JoystickTransform.X = ViewModel.XValue = x;
ViewModel.JoystickTransform.Y = ViewModel.YValue = y;
}
else
{
ViewModel.JoystickTransform.X = ViewModel.XValue = ViewModel.ControlRadius * (x / disp); //A*cos(x)
ViewModel.JoystickTransform.Y = ViewModel.YValue = ViewModel.ControlRadius * (y / disp); //A*sin(x)
}
ViewModel.OnJoyStickMoved?.Invoke(sender, new EventArgs());
}
这是一个如何使
Ellipse
跟随鼠标的例子。
<Grid RowDefinitions="Auto,*">
<StackPanel Grid.Row="0">
<TextBlock x:Name="PointerX" />
<TextBlock x:Name="PointerY" />
</StackPanel>
<Canvas
x:Name="Map"
Grid.Row="1"
Background="Transparent"
PointerMoved="Map_PointerMoved">
<Ellipse
x:Name="ControlArea"
Width="10"
Height="10"
Fill="SkyBlue" />
</Canvas>
</Grid>
private void Map_PointerMoved(object sender, PointerRoutedEventArgs e)
{
var position = e.GetCurrentPoint(this.Map).Position;
this.PointerX.Text = position.X.ToString();
this.PointerY.Text = position.Y.ToString();
Canvas.SetLeft(this.ControlArea, position.X);
Canvas.SetTop(this.ControlArea, position.Y);
}
确保设置
Canvas
的Background
以获取指针事件。
更新
你也可以使用绑定。
<Ellipse
x:Name="ControlArea"
Canvas.Left="{x:Bind ViewModel.XPosition, Mode=OneWay}"
Canvas.Top="{x:Bind ViewModel.YPosition, Mode=OneWay}"
Width="10"
Height="10"
Fill="SkyBlue" />