命令绑定 WPF
本文关键字:WPF 绑定 命令 | 更新日期: 2023-09-27 18:32:37
在我的简单应用程序中,我使用的是Command
和CommandBinding
。我的问题是,当我像这样在我的主窗口中声明Command
时:
<RibbonWindow x:Class="BooksDemo.MainWindow"
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:BooksDemo"
mc:Ignorable="d"
Title="MainWindow" Height="400" Width="600">
<Window.CommandBindings>
<CommandBinding Command="Close" Executed="OnClose" />
<CommandBinding Command="local:BooksCommands.ShowBooksList" />
</Window.CommandBindings>
<Ribbon DockPanel.Dock="Top">
<Ribbon.QuickAccessToolBar>
<RibbonQuickAccessToolBar>
<RibbonButton SmallImageSource="Images/one.png"
Command="local:BooksCommands.ShowBook"/>
<RibbonButton SmallImageSource="Images/list.png"
Command="local:BooksCommands.ShowBooksList"/>
</RibbonQuickAccessToolBar>
</Ribbon.QuickAccessToolBar>
<Ribbon.ApplicationMenu>
<RibbonApplicationMenu SmallImageSource="Images/books.png" >
<RibbonApplicationMenuItem Header="Show _Book" />
<RibbonSeparator />
<RibbonApplicationMenuItem Header="Exit" Command="Close" />
</RibbonApplicationMenu>
</Ribbon.ApplicationMenu>
<RibbonTab Header="Home">
<RibbonGroup Header="Clipboard">
<RibbonButton Command="Paste" Label="Paste"
LargeImageSource="Images/paste.png" />
<RibbonButton Command="Cut" SmallImageSource="Images/cut.png" />
<RibbonButton Command="Copy" SmallImageSource="Images/copy.png" />
<RibbonButton Command="Undo" LargeImageSource="Images/undo.png" />
</RibbonGroup>
<RibbonGroup Header="Show">
<RibbonButton LargeImageSource="Images/one.png" Label="Book" />
<RibbonButton LargeImageSource="Images/list.png" Label="Book List" />
<RibbonButton LargeImageSource="Images/grid.png" Label="Book Grid" />
</RibbonGroup>
</RibbonTab>
<RibbonTab Header="Ribbon Controls">
<RibbonGroup Header="Sample">
<RibbonButton Label="Button" />
<RibbonCheckBox Label="Checkbox" />
<RibbonComboBox Label="Combo1">
<Label>One</Label>
<Label>Two</Label>
</RibbonComboBox>
<RibbonTextBox>Text Box</RibbonTextBox>
<RibbonSplitButton Label="Split Button">
<RibbonMenuItem Header="One" />
<RibbonMenuItem Header="Two" />
</RibbonSplitButton>
<RibbonComboBox Label="Combo2" IsEditable="False">
<RibbonGallery SelectedValuePath="Content" MaxColumnCount="1"
SelectedValue="Green">
<RibbonGalleryCategory>
<RibbonGalleryItem Content="Red" Foreground="Red" />
<RibbonGalleryItem Content="Green" Foreground="Green" />
<RibbonGalleryItem Content="Blue" Foreground="Blue" />
</RibbonGalleryCategory>
</RibbonGallery>
</RibbonComboBox>
</RibbonGroup>
</RibbonTab>
<ListBox DockPanel.Dock="Left" Margin="5" MinWidth="120">
<Hyperlink Click="OnShowBook">Show Book</Hyperlink>
</ListBox>
<TabControl Margin="5" x:Name="tabControl1">
</TabControl>
</Ribbon>
它告诉我命名空间中不存在BooksCommands
。
在类 BooksCommands 中,我声明了命名空间:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace BooksDemo
{
class BooksCommands
{
private static RoutedUICommand showBook;
public static ICommand ShowBook
{
get
{
return showBook ?? (showBook = new RoutedUICommand("Show Book",
"ShowBook", typeof(BooksCommands)));
}
}
private static RoutedUICommand showBooksList;
public static ICommand ShowBooksList
{
get
{
if (showBooksList == null)
{
showBooksList = new RoutedUICommand("Show Books","ShowBooks",
typeof(BooksCommands));
showBook.InputGestures.Add(new KeyGesture(Key.B,Modifierkeys.
Alt));
}
return showBooksList;
}
}
}
这是MainWindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Controls.Ribbon;
namespace BooksDemo{
public partial class MainWindow : RibbonWindow
{
public MainWindow()
{
InitializeComponent();
}
private void OnClose(object sender, ExecutedRoutedEventArgs e)
{
Application.Current.Shutdown();
}
}
}
有人可以帮我吗?
- 公开
BooksCommands
课程。 - 将
<CommandBinding Command="local:BooksCommands.ShowBooksList" />
替换为<CommandBinding x:Key="CmdShowBooksListKey" Command="{x:Static local:BooksCommands.ShowBooksList}" />
尝试显式声明您的 BooksCommands 类为公共类。
此外,Visual Studio 中的 XAML 有时似乎对查找引用感到困惑,并且会引发错误。有时,这些警告/错误是"假的",如果您尝试运行应用程序而没有尝试成功构建它,这些警告/错误就会消失。我认为这是一个Visual Studio的怪癖,我还没有弄清楚。