【问题标题】:WPF Bind c# class to static resourceWPF 将 c# 类绑定到静态资源
【发布时间】:2017-02-22 11:19:14
【问题描述】:

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

如何将此类绑定到 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>

仍然没有实现命令工作

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    试试这样的:

    <ContentPresenter>
        <ContentPresenter.Content>
            <logic:ApplicationToolbar />
        </ContentPresenter.Content>
        <ContentPresenter.ContentTemplate>
            <DataTemplate>
                <ContentControl Content="{StaticResource MyToolbar}" />
            </DataTemplate>
        </ContentPresenter.ContentTemplate>
    </ContentPresenter>
    

    ContentPresenterContent 属性应该设置为 DataContext/ViewModel 的一个实例,ContentTemplate 应该设置为定义此对象外观的DataTemplate

    【讨论】:

    • 它工作,我得到了类的实例化,但命令没有启用:(好吧,我想我必须自己解决这个问题:)
    • 您应该将 ToolBar 作为 ApplicationToolbar 的 ControlTemplate 的一部分,因为这是一个控件。
    • 我已经更新了代码示例。这就是你想说的吗?似乎没有区别,类已实例化但命令绑定不起作用
    • 并非如此。但是,如果您有其他问题,请提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多