以表单样式

时间:2017-08-02 09:25:42

标签: wpf

我正在创建一个Windows风格,我已经将按钮集成在里面。 如何处理按钮的click事件? 我是否有义务创建一个custumcontrol?

这是我的wpf风格:

<Style TargetType="Window" x:Key="borderless">
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="WindowStyle" Value="None"/>
<Setter Property="ResizeMode" Value="CanResizeWithGrip"/>
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="Window">
            <Border Style="{DynamicResource windowBorder}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Button Grid.Column="3" Style="{DynamicResource minimizeButton}"/>
                        <Button Grid.Column="4" Style="{DynamicResource closeButton}"/>
                        <Image Height="20" Width="{Binding Height, RelativeSource={RelativeSource Self}}" Margin="2"/>
                        <TextBlock Text="Title" Style="{DynamicResource windowTitle}" Grid.Column="1"/>
                    </Grid>
                    <ContentPresenter Grid.Row="1"/>
                </Grid>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

谢谢!

1 个答案:

答案 0 :(得分:1)

有多种方法可以处理资源字典中样式内部的按钮单击。

方法1:文件背后的代码

请参阅:Is it possible to set code behind a resource dictionary in WPF for event handling?

简而言之:

  • 对于资源字典文件Warning in listLearners.character("cluster") : The following learners could not be constructed, probably because their packages are not installed: classif.ada,classif.bartMachine,classif.bdk,classif.blackboost,classif.boosting,classif.bst,classif.C50,classif.clusterSVM,classif.cvglmnet,classif.dbnDNN,classif.dcSVM,classif.earth,classif.evtree,classif.extraTrees,classif.fnn,classif.gamboost,classif.gaterSVM,classif.geoDA,classif.glmboost,classif.glmnet,classif.hdrda,classif.kknn,classif.LiblineaRL1L2SVC,classif.LiblineaRL1LogReg,classif.LiblineaRL2L1SVC,classif.LiblineaRL2LogReg,classif.LiblineaRL2SVC,classif.LiblineaRMultiClassSVC,classif.linDA,classif.lqa,classif.mda,classif.mlp,classif.neuralnet,classif.nnTrain,classif.nodeHarvest,classif.pamr,classif.penalized.fusedlasso,classif.penalized.lasso,classif.penalized.ridge,classif.plr,classif.quaDA,classif.randomForestSRC,classif.ranger,classif.rda,classif.rFerns,classif.rknn,classif.rotationForest,classif.RRF,classif.rrlda,classif.saeDNN,classif.sda,classif.sparseLDA,classif.xgboost [... truncated] ,请创建代码文件MyResource.xaml
  • 在xaml文件中:MyResource.xaml.cs
  • 在xaml.cs文件中,将专用资源字典创建为分部类:

<ResourceDictionary x:Class="MyNamespace.MyDictionary"
  • 添加click事件处理程序的方式与在窗口或usercontrol中执行的方式相同

方法2:使用来自viewmodel的命令

只需在viewmodel中创建一些namespace MyNamespace { public partial class MyDictionary : ResourceDictionary { public MyDictionary() { InitializeComponent(); } } } 属性,然后使用ICommand方法处理点击操作。然后在xaml中绑定命令

Execute

方法3:带命令绑定的命令

使用带命令绑定的视图命令。例如,我使用<Button Grid.Column="4" Style="{DynamicResource closeButton}" Command="{Binding MyViewmodelCommand}"/> 命令,但自定义自定义命令的原理相同。

在样式中,只需使用命令:

ApplicationCommands.Close

在可以使用代码的树的某处,将命令绑定到事件处理程序。例如在窗口中(但我不能100%确定它是否适用于以窗口本身为目标的样式)

<Button Grid.Column="4" Style="{DynamicResource closeButton}" Command="ApplicationCommands.Close"/>