WPF将c#类绑定到静态资源
我有一个xaml工具栏:WPF将c#类绑定到静态资源,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我有一个xaml工具栏: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:logic="clr-namespace:DD.Logic;assembly=DD.Logic"> &
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:logic="clr-namespace:DD.Logic;assembly=DD.Logic">
<ToolBar x:Key="MyToolbar" Height="120">
<!--File-->
<GroupBox Header="File" Style="{StaticResource ToolbarGroup}" Margin="5,3,3,3">
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Button Margin="3" Width="55" Style="{StaticResource ToolBarButtonBaseStyle}"
Command="{x:Static ApplicationCommands.New}">
<Button.Content>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="4*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Image Source="Images/GenericDocument.png" Width="45"/>
<TextBlock Grid.Row="1" Text="New" VerticalAlignment="Bottom" HorizontalAlignment="Center"/>
</Grid>
</Button.Content>
</Button>
<StackPanel Orientation="Vertical" Margin="0,2,0,2">
<Button Margin="1" Padding="2" HorizontalContentAlignment="Left"
Style="{StaticResource ToolBarButtonBaseStyle}"
Command="{x:Static ApplicationCommands.Open}">
<Button.Content>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Image Source="Images/OpenFolder.png" Width="16"/>
<TextBlock Margin="3,0,3,0" Text="Open" VerticalAlignment="Center" Grid.Column="1"/>
</Grid>
</Button.Content>
</Button>
<Button Margin="1" Padding="2" HorizontalContentAlignment="Left"
Style="{StaticResource ToolBarButtonBaseStyle}"
Command="{x:Static ApplicationCommands.Save}">
<Button.Content>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Image Source="Images/Save.png" Width="16"/>
<TextBlock Margin="3,0,3,0" Text="Save" VerticalAlignment="Center" Grid.Column="1"/>
</Grid>
</Button.Content>
</Button>
<Button Margin="1" Padding="2" HorizontalContentAlignment="Left"
Style="{StaticResource ToolBarButtonBaseStyle}"
Command="{x:Static ApplicationCommands.Print}">
<Button.Content>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Image Source="Images/Print.png" Width="16"/>
<TextBlock Margin="3,0,3,0" Text="Print" VerticalAlignment="Center" Grid.Column="1"/>
</Grid>
</Button.Content>
</Button>
</StackPanel>
</StackPanel>
</GroupBox>
<!--Format-->
<GroupBox Header="Format" Style="{StaticResource ToolbarGroup}" Margin="3">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0">Text font size:</TextBlock>
<ComboBox VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="1"
Height="20"
Width="80"
IsEditable="True"
Loaded="{x:Static logic:ApplicationToolbar.RoutedEvent}"
TextBoxBase.TextChanged="{x:Static logic:ApplicationToolbar.SelectionChangedEvent}"
/>
</Grid>
<Grid Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="0">Arrows:</TextBlock>
<ComboBox VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="1"
Name ="ArrowsCombobox"
Height="20"
Width="80"
Loaded="{x:Static logic:ApplicationToolbar.ArrowsComboboxLoaded}"
SelectionChanged="{x:Static logic:ApplicationToolbar.ArrowsComboboxSelectionChanged}"
/>
</Grid>
</Grid>
</GroupBox>
</ToolBar>
文本字体大小:
箭头:
在主窗口中显示为:
<ContentControl Content="{StaticResource MyToolbar}"/>
以及一个实现相应命令和处理程序的类:
public class ApplicationToolbar : Control
{
public static PathFinderType PathFinderType = PathFinderType.Straight;
public static RoutedEventHandler RoutedEvent = LoadFontSizes;
public static TextChangedEventHandler SelectionChangedEvent = FontSizeChanged;
public static RoutedEventHandler ArrowsComboboxLoaded = ArrowsComboboxLoadedHandler;
public static SelectionChangedEventHandler ArrowsComboboxSelectionChanged = ArrowsComboboxSelectionChangedHandler;
public static RoutedCommand Group = new RoutedCommand();
public static RoutedCommand Ungroup = new RoutedCommand();
//etc
public static RoutedCommand Redo = new RoutedCommand();
private readonly IDesignerCommandsReceiver _receiver;
public ApplicationToolbar()
{
var designer = FindChild<DesignerCanvas>(Application.Current.MainWindow, "DesignerCanvas");
_receiver = new DesignerCommandsReceiver(designer);
AddCommandBindings();
AddCommandGestures();
}
private void AddCommandBindings()
{
CommandBindings.Add(new CommandBinding(ApplicationCommands.New, New_Executed));
// some more bindings
CommandBindings.Add(new CommandBinding(Redo, Redo_Executed, Redo_Enabled));
}
private static void AddCommandGestures()
{
SelectAll.InputGestures.Add(new KeyGesture(Key.A, ModifierKeys.Control));
Undo.InputGestures.Add(new KeyGesture(Key.Z, ModifierKeys.Control));
Redo.InputGestures.Add(new KeyGesture(Key.Y, ModifierKeys.Control));
}
private void New_Executed(object sender, ExecutedRoutedEventArgs e)
{
_receiver.New();
}
// other commands implementations
private void Redo_Enabled(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = StateSaver.Instance.IsRedoAvailable();
}
public static void ArrowsComboboxLoadedHandler(object sender, RoutedEventArgs e)
{
}
private static void ArrowsComboboxSelectionChangedHandler(object sender, SelectionChangedEventArgs selectionChangedEventArgs)
{
}
// other event handlers
}
public enum PathFinderType
{
Straight,
Ambient,
Polygon
}
公共类应用程序工具栏:控件
{
公共静态PathFinderType PathFinderType=PathFinderType.Straight;
公共静态RoutedEventHandler RoutedEvent=LoadFontSizes;
公共静态文本ChangedEventHandler SelectionChangedEvent=FontSizeChanged;
public static RoutedEventHandler arrowscomboxLoaded=arrowscomboxLoadedHandler;
public static selectionchangedenthandler arrowscomboxselectionchanged=arrowscomboxselectionchangedhandler;
公共静态RoutedCommand组=新RoutedCommand();
public static RoutedCommand Ungroup=new RoutedCommand();
//等
public static RoutedCommand Redo=new RoutedCommand();
专用只读IDesignerCommandsReceiver\u receiver;
公共应用程序工具栏()
{
var designer=FindChild(Application.Current.main窗口,“DesignerCanvas”);
_接收方=新设计方通信接收方(设计方);
AddCommandBindings();
添加命令手势();
}
私有void AddCommandBindings()
{
Add(newcommandbinding(ApplicationCommands.new,new_Executed));
//还有一些绑定
添加(新的CommandBinding(重做,重做已执行,重做已启用));
}
私有静态void addcommandbirters()
{
选择All.InputSignals.Add(新建键手势(键A,ModifierKeys.Control));
Undo.inputpirates.Add(新的键手势(Key.Z,ModifierKeys.Control));
添加(新的键手势(Key.Y,ModifierKeys.Control));
}
私有void New_Executed(对象发送方,ExecutedRoutedEventArgs e)
{
_receiver.New();
}
//其他命令实现
已启用私有void Redo_(对象发送方,CanExecuteRoutedEventArgs e)
{
e、 CanExecute=StateSaver.Instance.IsRedoAvailable();
}
公共静态无效箭头ComboxLoadedHandler(对象发送方,RoutedEventTargets e)
{
}
私有静态无效箭头mboxSelectionChangedHandler(对象发送者,SelectionChangedEventArgs SelectionChangedEventArgs)
{
}
//其他事件处理程序
}
公共枚举PathFinderType
{
直的
环境的,
多边形
}
如何将此类绑定到xaml演示文稿?我尝试将ContentPresenter与指定的DataContext一起使用,但不起作用:
<ContentPresenter Content="{StaticResource MyToolbar}" DataContext="{x:Type logic:ApplicationToolbar}"/>
更新
ApplicationToolbar.xaml现在是:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:logic="clr-namespace:DD.Logic;assembly=DD.Logic">
<ControlTemplate x:Key="MyToolbar">
<ToolBar Height="120">
//similar code
</ToolBar>
</ControlTemplate>
//相似代码
打印出来的是:
<ContentPresenter>
<ContentPresenter.Content>
<logic:ApplicationToolbar />
</ContentPresenter.Content>
<ContentPresenter.ContentTemplate>
<DataTemplate>
<Control Template="{StaticResource MyToolbar}" />
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
仍然没有实现工作命令尝试以下操作:
<ContentPresenter>
<ContentPresenter.Content>
<logic:ApplicationToolbar />
</ContentPresenter.Content>
<ContentPresenter.ContentTemplate>
<DataTemplate>
<ContentControl Content="{StaticResource MyToolbar}" />
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
ContentPresenter
的Content
属性应该设置为DataContext/ViewModel的实例,而ContentTemplate
属性应该设置为定义此对象外观的DataTemplate
。它起作用了,我实例化了类,但没有启用命令:(我想我必须自己解决这个问题:)您可能应该使工具栏成为ApplicationToolbar的ControlTemplate的一部分,因为这是一个控件。我已经更新了代码示例。这就是您的意思吗?似乎没有什么区别,类被实例化了,但命令绑定没有真正起作用。但是如果您有其他问题,请问一个新问题。