2017-02-22 246 views
1

我有一個XAML工具欄:WPF綁定C#類的靜態資源

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

仍然沒有實現可以工作的命令< - 通過將所有與命令相關的代碼返回給設計器類來解決問題。我想應該將CommandBindings添加到設計器對象的CommandBindingsCollection中,而不是應用程序工具欄。

回答

1

嘗試這樣:

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

一個ContentPresenterContent屬性應該被設定到DataContext /視圖模型的一個實例和ContentTemplateDataTemplate定義此對象的外觀。

+0

它的工作原理,我得到了類實例化,但命令沒有啓用:(嗯,我想我必須自己解決這個問題:) – eXPerience

+0

你應該可以使ApplicationToolbar的ControlTemplate的ToolBar部分,因爲這是一個控制。 – mm8

+0

我已經更新了代碼示例。這是你的意思嗎?似乎沒有區別,類被實例化,但命令綁定不起作用 – eXPerience