WPF 为什么我的 Line 对象没有改变位置?
WPF Why are my Line objects not changing position?
我想在图形中显示两条水平线。线条的位置取决于一些数据。
为此,我创建了一个 ValueConverter(基本上是 double to int)。问题是,线条总是显示在相同的位置。
我必须关注 XAML:
<Window
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:CGM_Auswertung"
xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="CGM_Auswertung.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="780" Width="1300" Loaded="Window_Loaded">
<Window.Resources>
<local:DoubleToPositionConverter x:Key="DtPConverter"/>
</Window.Resources>
<Grid Name="MainGrid">
<StackPanel Margin="10" Orientation="Vertical">
<Button Name="OpenFile" Content="Öffnen" Height="30" Margin="550,0" Click="OpenFile_Click"/>
<Grid x:Name="drawGrid" >
<TextBox Height="30" Width="40" HorizontalAlignment="Left" VerticalAlignment="Top" Text="{Binding OptMinimum}"/>
<Frame x:Name="drawFrame" HorizontalAlignment="Left" Height="420" Margin="40,10,10,50" VerticalAlignment="Top" Width="1210" BorderBrush="Black" BorderThickness="3">
<Frame.Content>
<Grid Name="contentGrid" Background="Transparent" >
<Line x:Name="MinLine" Stroke="Red" StrokeThickness="2" StrokeDashArray="2,2" X1="0" X2="1200" Y1="{Binding OptMinimum, Converter={StaticResource DtPConverter}}" Y2="{Binding OptMinimum, Converter={StaticResource DtPConverter}}"/>
<Line x:Name="MaxLine" Stroke="Red" StrokeThickness="2" StrokeDashArray="2,2" X1="0" X2="1200" Y1="{Binding OptMaximum, Converter={StaticResource DtPConverter}}" Y2="{Binding OptMaximum, Converter={StaticResource DtPConverter}}"/>
<Grid Name="vertLineGrid" MouseMove="tempLineGrid_MouseMove" Background="Transparent" HorizontalAlignment="Center" VerticalAlignment="Center" Height="394" Width="1183" MouseUp="ReleaseSelectedItem"/>
</Grid>
</Frame.Content>
...
这是转换器:
namespace CGM_Auswertung
{
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChanged?.Invoke(this, e);
}
}
public class ViewModel : ViewModelBase
{
...
private double _optMinimum;
public double OptMinimum
{
get { return _optMinimum; }
set
{
_optMinimum = value;
OnPropertyChanged(new PropertyChangedEventArgs("OptMinimum"));
}
}
private double _optMaximum;
public double OptMaximum
{
get { return _optMaximum; }
set
{
_optMaximum = value;
OnPropertyChanged(new PropertyChangedEventArgs("OptMaximum"));
}
}
}
public class DoubleToPositionConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (int)(Math.Abs(400 - (double)value * 20));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (double)(Math.Abs((double)value / 20 - 400 / 20));
}
}
}
我在转换器之前也试过这个:
[ValueConversion(typeof(double),typeof(int))]
但它并没有改变任何东西
这是我的程序的开始:
namespace CGM_Auswertung
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private List<CGM_Measurement> completeMeasures = new List<CGM_Measurement>();
private ViewModel mvm = new ViewModel() { MinimalValue = 0, MaximalValue=0, ActualValue=0};
private UIElement selectedItem = null;
public MainWindow()
{
mvm.FirstDay = mvm.LastDay = DateTime.Today;
mvm.OverviewText = "Switch to day view";
mvm.Visual = Visibility.Visible;
mvm.VisualInverse = Visibility.Collapsed;
mvm.OptMinimum = 2.0;
mvm.OptMaximum = 3.0;
InitializeComponent();
MainGrid.DataContext = mvm;
}
我猜问题出在 xaml 的某处,因为当我在我的转换器中设置断点时,永远不会调用转换。
我猜是因为转换非常简单,所以我可以在我的视图模型中使用另一个 属性。但由于我仍在学习 WPF,所以我想使用值转换器来完成它。
感谢您的帮助。
Frame
不继承父容器的 DataContext(在 this SO post 中解释)。因此 contentGrid
缺少其绑定的来源。结果绑定没有被解析并且转换器没有被调用。尝试用 ContentControl 替换 Frame
或完全删除它
我想在图形中显示两条水平线。线条的位置取决于一些数据。 为此,我创建了一个 ValueConverter(基本上是 double to int)。问题是,线条总是显示在相同的位置。
我必须关注 XAML:
<Window
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:CGM_Auswertung"
xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="CGM_Auswertung.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="780" Width="1300" Loaded="Window_Loaded">
<Window.Resources>
<local:DoubleToPositionConverter x:Key="DtPConverter"/>
</Window.Resources>
<Grid Name="MainGrid">
<StackPanel Margin="10" Orientation="Vertical">
<Button Name="OpenFile" Content="Öffnen" Height="30" Margin="550,0" Click="OpenFile_Click"/>
<Grid x:Name="drawGrid" >
<TextBox Height="30" Width="40" HorizontalAlignment="Left" VerticalAlignment="Top" Text="{Binding OptMinimum}"/>
<Frame x:Name="drawFrame" HorizontalAlignment="Left" Height="420" Margin="40,10,10,50" VerticalAlignment="Top" Width="1210" BorderBrush="Black" BorderThickness="3">
<Frame.Content>
<Grid Name="contentGrid" Background="Transparent" >
<Line x:Name="MinLine" Stroke="Red" StrokeThickness="2" StrokeDashArray="2,2" X1="0" X2="1200" Y1="{Binding OptMinimum, Converter={StaticResource DtPConverter}}" Y2="{Binding OptMinimum, Converter={StaticResource DtPConverter}}"/>
<Line x:Name="MaxLine" Stroke="Red" StrokeThickness="2" StrokeDashArray="2,2" X1="0" X2="1200" Y1="{Binding OptMaximum, Converter={StaticResource DtPConverter}}" Y2="{Binding OptMaximum, Converter={StaticResource DtPConverter}}"/>
<Grid Name="vertLineGrid" MouseMove="tempLineGrid_MouseMove" Background="Transparent" HorizontalAlignment="Center" VerticalAlignment="Center" Height="394" Width="1183" MouseUp="ReleaseSelectedItem"/>
</Grid>
</Frame.Content>
...
这是转换器:
namespace CGM_Auswertung
{
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChanged?.Invoke(this, e);
}
}
public class ViewModel : ViewModelBase
{
...
private double _optMinimum;
public double OptMinimum
{
get { return _optMinimum; }
set
{
_optMinimum = value;
OnPropertyChanged(new PropertyChangedEventArgs("OptMinimum"));
}
}
private double _optMaximum;
public double OptMaximum
{
get { return _optMaximum; }
set
{
_optMaximum = value;
OnPropertyChanged(new PropertyChangedEventArgs("OptMaximum"));
}
}
}
public class DoubleToPositionConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (int)(Math.Abs(400 - (double)value * 20));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (double)(Math.Abs((double)value / 20 - 400 / 20));
}
}
}
我在转换器之前也试过这个:
[ValueConversion(typeof(double),typeof(int))]
但它并没有改变任何东西 这是我的程序的开始:
namespace CGM_Auswertung
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private List<CGM_Measurement> completeMeasures = new List<CGM_Measurement>();
private ViewModel mvm = new ViewModel() { MinimalValue = 0, MaximalValue=0, ActualValue=0};
private UIElement selectedItem = null;
public MainWindow()
{
mvm.FirstDay = mvm.LastDay = DateTime.Today;
mvm.OverviewText = "Switch to day view";
mvm.Visual = Visibility.Visible;
mvm.VisualInverse = Visibility.Collapsed;
mvm.OptMinimum = 2.0;
mvm.OptMaximum = 3.0;
InitializeComponent();
MainGrid.DataContext = mvm;
}
我猜问题出在 xaml 的某处,因为当我在我的转换器中设置断点时,永远不会调用转换。
我猜是因为转换非常简单,所以我可以在我的视图模型中使用另一个 属性。但由于我仍在学习 WPF,所以我想使用值转换器来完成它。
感谢您的帮助。
Frame
不继承父容器的 DataContext(在 this SO post 中解释)。因此 contentGrid
缺少其绑定的来源。结果绑定没有被解析并且转换器没有被调用。尝试用 ContentControl 替换 Frame
或完全删除它