2011-08-12 20 views
19

Şu anda bir Metro Tarz Pencere uygulamak için çalışıyorum.
Yani ben bir ResourceDictionary içine aşağıdaki stilleri yaptık:WPF bir ControlTemplate için ResourceDictionary olayları

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

Sorunum ben nasıl de sürükleme özelliğini uygulamak için hiçbir fikrim yok olmasıdır.
DragRectangle aracımın bir Command özelliği yoktur, bu yüzden MVVM kullanarak bir Rectangle üzerinde MouseLeftButtonDown'da DragMove() yöntemini nasıl çağırabilirim? Eğer bir olay işleyicisi ekleyin ve çağrı DragMove orada

kodunu ayarlama arkadan birkaç adım gerektirir böylece

Teşekkür

cevap

31

Bir ResourceDictionary sadece Windows'un vs gibi arkasında kod olabilir.

  • sizin ResourceDictionary çağrılırsa

    MetroStyleResourceDictionary.xaml Eğer MetroStyleResourceDictionary.xaml.cs
  • dosyanın arkasında kod sonra Bundan sonra bu

    public partial class MetroStyleResourceDictionary 
    { 
        //... 
    } 
    
  • gibi görünmelidir denilen aynı klasörde Visual Studio'da yeni bir dosya eklemek için, x:Class özniteliği,

    <ResourceDictionary x:Class="YourNamespace.MetroStyleResourceDictionary" 
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <!--...--> 
    </ResourceDictionary> 
    
  • için eklemeniz gerekir

Artık MouseLeftButtonDown için dragRectangle öğesine bir olay işleyicisi ekleyebilirsiniz. Ayrıca Window bir tutma böylece Tag için

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

iyi bir fikir olabileceğini bağlayıcı almak gerekir Ve nihayet bu

gibi görünecek dosyanın arkasında koduna olay işleyicisi ekleyebilir
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

Harika! Gönderdiğiniz için teşekkürler! – user500099

İlgili konular