style plantillas para modern gratis wpf events xaml command resourcedictionary

plantillas - style in wpf



Eventos de WPF en ResourceDictionary para un ControlTemplate (1)

Actualmente estoy tratando de implementar una ventana de estilo Metro.
Así que he hecho los siguientes estilos dentro de un ResourceDictionary:

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

Mi problema es que no tengo idea de cómo implementar la función de arrastre.
Mi dragRectangle no tiene una propiedad de Comando, entonces, ¿cómo puedo llamar a DragMove () en MouseLeftButtonDown en un Rectángulo usando MVVM?

Gracias


Un ResourceDictionary puede tener un código detrás como Windows, etc., así que puedes agregar un controlador de eventos y llamar a DragMove desde allí.

Configurar el código detrás requiere un par de pasos.

  • Si su ResourceDictionary se llama MetroStyleResourceDictionary.xaml , agregue un nuevo archivo en Visual Studio en la misma carpeta llamada MetroStyleResourceDictionary.xaml.cs
  • El código detrás del archivo debería verse así.

    public partial class MetroStyleResourceDictionary { //... }

  • Después de eso, debe agregar el atributo x:Class al archivo 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>

Ahora puede agregar un controlador de eventos al dragRectangle para MouseLeftButtonDown . También deberás conseguir una Window de la Window por lo que vincularla a Tag podría ser una buena idea

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

Y finalmente, puede agregar el controlador de eventos al código detrás del archivo que se verá así

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(); } } }