Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF将c#类绑定到静态资源_C#_.net_Wpf_Xaml - Fatal编程技术网

WPF将c#类绑定到静态资源

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"> &

我有一个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">

<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的一部分,因为这是一个控件。我已经更新了代码示例。这就是您的意思吗?似乎没有什么区别,类被实例化了,但命令绑定没有真正起作用。但是如果您有其他问题,请问一个新问题。