2011-08-12 40 views
19

現在、Metroスタイルのウィンドウを実装しようとしています。
は、だから私はのResourceDictionary内の次のスタイルを作った:ControlTemplateのResourceDictionaryのWPFイベント

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

<!-- Brushes --> 
<SolidColorBrush x:Key="BackgroundColor" Color="#FFFFFFFF" /> 

<!-- Buttons --> 
<Style x:Key="MetroControlBoxButton" TargetType="Button"> 
    <Setter Property="Background" Value="{StaticResource BackgroundColor}" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <ContentPresenter /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<!-- Windows --> 
<Style x:Key="MetroWindow" TargetType="Window"> 
    <Setter Property="UseLayoutRounding" Value="True" /> 
    <Setter Property="WindowStyle" Value="None" /> 
    <Setter Property="ResizeMode" Value="NoResize" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Window"> 
       <Grid Background="{StaticResource BackgroundColor}"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="6" /> 
         <RowDefinition Height="24" /> 
         <RowDefinition Height="*" /> 
         <RowDefinition Height="24" /> 
         <RowDefinition Height="6" /> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="6" /> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="6" /> 
        </Grid.ColumnDefinitions> 

        <Rectangle Name="topLeftBorderRectangle" Fill="Red" Grid.Row="0" Grid.Column="0" /> 
        <Rectangle Name="topCenterBorderRectangle" Fill="Orange" Grid.Row="0" Grid.Column="1" /> 
        <Rectangle Name="topRightBorderRectangle" Fill="Red" Grid.Row="0" Grid.Column="2" /> 
        <Rectangle Name="middleLeftBorderRectangle" Fill="Orange" Grid.Row="1" Grid.RowSpan="3" Grid.Column="0" /> 
        <Rectangle Name="middleRightBorderRectangle" Fill="Orange" Grid.Row="1" Grid.RowSpan="3" Grid.Column="2" /> 
        <Rectangle Name="bottomLeftBorderRectangle" Fill="Red" Grid.Row="4" Grid.Column="0" /> 
        <Rectangle Name="bottomCenterBorderRectangle" Fill="Orange" Grid.Row="4" Grid.Column="1" /> 
        <Rectangle Name="bottomRightBorderRectangle" Fill="Red" Grid.Row="4" Grid.Column="2" /> 

        <Rectangle Name="statusBarRectangle" Fill="Yellow" Grid.Row="3" Grid.Column="1" /> 

        <Grid Grid.Row="1" Grid.Column="1"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*" /> 
         </Grid.RowDefinitions> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto" /> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition Width="28" /> 
          <ColumnDefinition Width="28" /> 
          <ColumnDefinition Width="28" /> 
         </Grid.ColumnDefinitions> 

         <Rectangle Name="dragRectangle" Fill="Yellow" Grid.Row="0" Grid.Column="1" /> 
         <Button Name="minimizeButton" Content="_" Grid.Row="0" Grid.Column="2" Style="{StaticResource MetroControlBoxButton}" Command="{Binding Path=DataContext.MinimizeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 
         <Button Name="maximizeButton" Content="[]" Grid.Row="0" Grid.Column="3" Style="{StaticResource MetroControlBoxButton}" Command="{Binding Path=DataContext.MaximizeNormalizeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 
         <Button Name="closeButton" Content="X" Grid.Row="0" Grid.Column="4" Style="{StaticResource MetroControlBoxButton}" Command="{Binding Path=DataContext.CloseCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 
        </Grid> 

        <ContentPresenter Grid.Row="2" Grid.Column="1" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

</ResourceDictionary> 

私の問題は、私はどのようにデ・ドラッグ機能を実装するには考えているということです。
私のdragRectangleはCommandプロパティを持たないので、MVVMを使ってRectangleのMouseLeftButtonDownでDragMove()を呼び出すにはどうしたらいいですか?あなたは、イベントハンドラを追加し、呼び出しDragMove

コードの設定から後ろの手順のカップルを必要とすることができるように

おかげ

答えて

31

AのResourceDictionaryはただのWindowsなどのように背後にあるコードを持つことができます。

  • あなたのResourceDictionaryが呼び出された場合

    MetroStyleResourceDictionary.xamlあなたはMetroStyleResourceDictionary.xaml.cs
  • ファイルの背後にあるコードは、その後、この

    public partial class MetroStyleResourceDictionary 
    { 
        //... 
    } 
    
  • のようになりますと呼ばれる同じフォルダ内のVisual Studioで新しいファイルを追加しますx:Class属性をXamlファイルに追加する必要があります。

    <ResourceDictionary x:Class="YourNamespace.MetroStyleResourceDictionary" 
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <!--...--> 
    </ResourceDictionary> 
    

今度はMouseLeftButtonDownのイベントハンドラをdragRectangleに追加できます。あなたもそうTag

<Rectangle Name="dragRectangle" 
      MouseLeftButtonDown="dragRectangle_MouseLeftButtonDown" 
      Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
      .../> 

良い考えかもしれませんそして最後に、あなたがこの

のようになります。分離コードファイルにイベントハンドラを追加することができます結合 Windowのホールドを取得する必要があります
public partial class MetroStyleResourceDictionary 
{ 
    void dragRectangle_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     Rectangle dragRectangle = sender as Rectangle; 
     Window window = dragRectangle.Tag as Window; 
     if (window != null) 
     { 
      window.DragMove(); 
     } 
    } 
} 
+1

素晴らしい!投稿ありがとう!!! – user500099

関連する問題