當影像的Source屬性不為空時,僅啟用背景關系選單項的最佳方法是什么?這是 XAML:
<Window.Resources>
<local:IsNullValueConverter x:Key="IsNullValueConverter" />
<local:NotNullValueConverter x:Key="NotNullValueConverter" />
</Window.Resources>
<DockPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<Button Content="Fill" IsEnabled="{Binding ElementName=TheImage, Path=Source, Converter={StaticResource IsNullValueConverter}}" Click="Fill_Click" />
<Button Content="Erase" IsEnabled="{Binding ElementName=TheImage, Path=Source, Converter={StaticResource NotNullValueConverter}}" Click="Erase_Click" />
</StackPanel>
<Grid DockPanel.Dock="Bottom" Background="White">
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Fill" IsEnabled="{Binding ElementName=TheImage, Path=Source, Converter={StaticResource IsNullValueConverter}}" Click="Fill_Click" />
<MenuItem Header="Erase" IsEnabled="{Binding ElementName=TheImage, Path=Source, Converter={StaticResource NotNullValueConverter}}" Click="Erase_Click" />
</ContextMenu>
</Grid.ContextMenu>
<Image Name="TheImage" />
</Grid>
</DockPanel>
這是代碼:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Fill_Click(object sender, RoutedEventArgs e)
{
int width = 1;
int height = 1;
var format = PixelFormats.Gray8;
var pixels = new byte[width * height * (format.BitsPerPixel / 8)];
TheImage.Source = BitmapSource.Create(width, height, 96.0, 96.0, format, null, pixels, width * (format.BitsPerPixel / 8));
}
private void Erase_Click(object sender, RoutedEventArgs e)
{
TheImage.Source = null;
}
}
public class IsNullValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class NotNullValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value != null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
這些按鈕的反應完全符合我的要求:最初僅啟用填充,然后單擊它并填充影像后,它被禁用,而擦除啟用。然而,背景關系選單項都始終啟用,盡管它們的IsEnabled屬性使用與按鈕完全相同的系結。
uj5u.com熱心網友回復:
我嘗試了很多不同的解決方案,最后發現了一些簡單的方法:
<MenuItem Header="Fill" IsEnabled="{Binding Source={x:Reference TheImage}, Path=Source, Converter={StaticResource IsNullValueConverter}}" Click="Fill_Click" />
<MenuItem Header="Erase" IsEnabled="{Binding Source={x:Reference TheImage}, Path=Source, Converter={StaticResource NotNullValueConverter}}" Click="Erase_Click" />
或者,可以將其添加到代碼中(必須命名背景關系選單),但在 XAML 中執行此操作似乎更加優雅。
NameScope.SetNameScope(TheContextMenu, NameScope.GetNameScope(this));
感謝 ZSH 為我指明了正確的方向。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/423096.html
標籤:
上一篇:如何在wpf中播放MP4?
