2011-08-12 15 views
19

Obecnie próbuję implementować okno w stylu Metro.
Więc zrobiłem następujące style wewnątrz ResourceDictionary:Zdarzenia WPF w ResourceDictionary dla ControlTemplate

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

Moim problemem jest to, że nie mam pojęcia, jak wdrożyć de funkcji przeciągania.
Mój dragRectangle nie ma właściwości Command, więc jak mogę wywołać funkcję DragMove() na MouseLeftButtonDown na prostokącie za pomocą MVVM?

Dzięki

Odpowiedz

31

ResourceDictionary mogą mieć kod za podobnie jak okna itp więc można dodać moduł obsługi zdarzeń i nazywają DragMove stamtąd

Ustawianie kodu za wymaga kilku etapów.

  • Jeśli ResourceDictionary nazywa MetroStyleResourceDictionary.xaml dodaniu nowego pliku w programie Visual Studio w tym samym folderze o nazwie MetroStyleResourceDictionary.xaml.cs
  • Kod związany z pliku powinna wyglądać następująco

    public partial class MetroStyleResourceDictionary 
    { 
        //... 
    } 
    
  • Po tym należy dodać atrybut x:Class do pliku 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> 
    

Teraz można dodać procedurę obsługi zdarzeń do dragRectangle dla MouseLeftButtonDown. Trzeba także się trzymać z Window tak że wiązanie do Tag może być dobrym pomysłem

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

I wreszcie można dodać obsługi zdarzeń do kodu za pliku, który będzie wyglądał tak

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

Świetne !! Dzięki za publikację !!! – user500099

Powiązane problemy