WPF 使用附加属性增加控件属性

原文:WPF 使用附加属性增加控件属性

使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活

一、自定义附加属性


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Input;

using System.Windows.Media;

namespace Demo3.Control

{

    public class ControlAttachProperty

    {

        #region 圆角

        public static CornerRadius GetCornerRadius(DependencyObject obj)         //注意附加属性定义和依赖属性的不同

        {

            return (CornerRadius)obj.GetValue(CornerRadiusProperty);  //Obj是使用了附加属性的对象

        }

        public static void SetCornerRadius(DependencyObject obj, CornerRadius value)

        {

            obj.SetValue(CornerRadiusProperty, value);

        }

        // Using a DependencyProperty as the backing store for CornerRadius.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty CornerRadiusProperty =

            DependencyProperty.RegisterAttached("CornerRadius"typeof(CornerRadius), typeof(ControlAttachProperty), new PropertyMetadata(null));

        

        #endregion

        #region 用户头像模板

        public static ControlTemplate GetIconTemplate(DependencyObject obj)

        {

            return (ControlTemplate)obj.GetValue(IconTemplateProperty);

        }

        public static void SetIconTemplate(DependencyObject obj, ControlTemplate value)

        {

            obj.SetValue(IconTemplateProperty, value);

        }

        // Using a DependencyProperty as the backing store for IconTemplate.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty IconTemplateProperty =

            DependencyProperty.RegisterAttached("IconTemplate"typeof(ControlTemplate), typeof(ControlAttachProperty), new PropertyMetadata(null));

        #endregion

        #region 删除按妞区域模板

        public static ControlTemplate GetAttachTemplate(DependencyObject obj)

        {

            return (ControlTemplate)obj.GetValue(AttachTemplateProperty);

        }

        public static void SetAttachTemplate(DependencyObject obj, ControlTemplate value)

        {

            obj.SetValue(AttachTemplateProperty, value);

        }

        // Using a DependencyProperty as the backing store for AttachTemplate.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty AttachTemplateProperty =

            DependencyProperty.RegisterAttached("AttachTemplate"typeof(ControlTemplate), typeof(ControlAttachProperty), new PropertyMetadata(null));

        

        #endregion

        #region 用户名水印

        public static string GetUserNameWaterMark(DependencyObject obj)

        {

            return (string)obj.GetValue(UserNameWaterMarkProperty);

        }

        public static void SetUserNameWaterMark(DependencyObject obj, string value)

        {

            obj.SetValue(UserNameWaterMarkProperty, value);

        }

        // Using a DependencyProperty as the backing store for UserNameWaterMark.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty UserNameWaterMarkProperty =

            DependencyProperty.RegisterAttached("UserNameWaterMark"typeof(string), typeof(ControlAttachProperty), new PropertyMetadata(null));

        #endregion

        #region 密码水印

        public static string GetPasswordWaterMark(DependencyObject obj)

        {

            return (string)obj.GetValue(PasswordWaterMarkProperty);

        }

        public static void SetPasswordWaterMark(DependencyObject obj, string value)

        {

            obj.SetValue(PasswordWaterMarkProperty, value);

        }

        // Using a DependencyProperty as the backing store for PasswordWaterMark.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty PasswordWaterMarkProperty =

            DependencyProperty.RegisterAttached("PasswordWaterMark"typeof(string), typeof(ControlAttachProperty), new PropertyMetadata(null));

 

        #endregion

        #region 用户头像(未被点击时)

        public static string GetUserIcon(DependencyObject obj)

        {

            return (string)obj.GetValue(UserIconProperty);

        }

        public static void SetUserIcon(DependencyObject obj, string value)

        {

            obj.SetValue(UserIconProperty, value);

        }

        // Using a DependencyProperty as the backing store for UserIcon.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty UserIconProperty =

            DependencyProperty.RegisterAttached("UserIcon"typeof(string), typeof(ControlAttachProperty), new PropertyMetadata(null));     

      

        #endregion

        #region 用户头像(点击时)

        public static string GetUserIconPress(DependencyObject obj)

        {

            return (string)obj.GetValue(UserIconPressProperty);

        }

        public static void SetUserIconPress(DependencyObject obj, string value)

        {

            obj.SetValue(UserIconPressProperty, value);

        }

        // Using a DependencyProperty as the backing store for UserIconPress.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty UserIconPressProperty =

            DependencyProperty.RegisterAttached("UserIconPress"typeof(string), typeof(ControlAttachProperty), new PropertyMetadata(null));

        

        #endregion

        #region 密码图标(未被点击时)

        public static string GetPassWordIcon(DependencyObject obj)

        {

            return (string)obj.GetValue(PassWordIconProperty);

        }

        public static void SetPassWordIcon(DependencyObject obj, string value)

        {

            obj.SetValue(PassWordIconProperty, value);

        }

        // Using a DependencyProperty as the backing store for PassWordIcon.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty PassWordIconProperty =

            DependencyProperty.RegisterAttached("PassWordIcon"typeof(string), typeof(ControlAttachProperty), new PropertyMetadata(null));

       

        #endregion

        #region 密码图标(点击时)

        public static string GetPasswordIconPress(DependencyObject obj)

        {

            return (string)obj.GetValue(PasswordIconPressProperty);

        }

        public static void SetPasswordIconPress(DependencyObject obj, string value)

        {

            obj.SetValue(PasswordIconPressProperty, value);

        }

        // Using a DependencyProperty as the backing store for PasswordIconPress.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty PasswordIconPressProperty =

            DependencyProperty.RegisterAttached("PasswordIconPress"typeof(string), typeof(ControlAttachProperty), new PropertyMetadata(null));

  

        #endregion

        #region 删除按妞背景图片

        public static ImageBrush GetDeleteButtonBG(DependencyObject obj)

        {

            return (ImageBrush)obj.GetValue(DeleteButtonBGProperty);

        }

        public static void SetDeleteButtonBG(DependencyObject obj, ImageBrush value)

        {

            obj.SetValue(DeleteButtonBGProperty, value);

        }

        // Using a DependencyProperty as the backing store for DeleteButtonBG.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty DeleteButtonBGProperty =

            DependencyProperty.RegisterAttached("DeleteButtonBG"typeof(ImageBrush), typeof(ControlAttachProperty), new PropertyMetadata(null));

        #endregion

        #region 定义是否开启绑定事件

        public static bool GetIsCommandClearTextEvent(DependencyObject obj)

        {

            return (bool)obj.GetValue(IsCommandClearTextEventProperty);

        }

        public static void SetIsCommandClearTextEvent(DependencyObject obj, bool value)

        {

            obj.SetValue(IsCommandClearTextEventProperty, value);

        }

        // Using a DependencyProperty as the backing store for IsCommandClearTextEvent.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty IsCommandClearTextEventProperty =

            DependencyProperty.RegisterAttached("IsCommandClearTextEvent"typeof(bool), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(false,IsCommandClearTextEventChanged));

        private static void IsCommandClearTextEventChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)

        {

        }

        #endregion

        #region 是否显示密码样式

        public static bool GetIsVisiblityPassword(DependencyObject obj)

        {

            return (bool)obj.GetValue(IsVisiblityPasswordProperty);

        }

        public static void SetIsVisiblityPassword(DependencyObject obj, bool value)

        {

            obj.SetValue(IsVisiblityPasswordProperty, value);

        }

        // Using a DependencyProperty as the backing store for IsVisiblityPassword.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty IsVisiblityPasswordProperty =

            DependencyProperty.RegisterAttached("IsVisiblityPassword"typeof(bool), typeof(ControlAttachProperty), new PropertyMetadata(false));

        #endregion

        #region 清除事件命令

        public static bool GetIsClearTextButtonBehaviorEnabled(DependencyObject obj)

        {

            return (bool)obj.GetValue(IsClearTextButtonBehaviorEnabledProperty);

        }

        public static void SetIsClearTextButtonBehaviorEnabled(DependencyObject obj, bool value)

        {

            obj.SetValue(IsClearTextButtonBehaviorEnabledProperty, value);

        }

        // Using a DependencyProperty as the backing store for IsClearTextButtonBehaviorEnabled.  This enables animation, styling, binding, etc...

        public static readonly DependencyProperty IsClearTextButtonBehaviorEnabledProperty =

            DependencyProperty.RegisterAttached("IsClearTextButtonBehaviorEnabled"typeof(bool), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(false,IsClearTextButtonBehaviorEnabledChanged));

        /// <summary>

        /// 当附加属性值发生改变时,调用此方法

        /// </summary>

        /// <param name="d"></param>

        /// <param name="e"></param>

        private static void IsClearTextButtonBehaviorEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

        {

            var button=d as DeleteButton;

            if(e.OldValue != e.NewValue)

            {

                //当命令触发的时候,会向上传递,而此时这个命令外围就是自己本身

                button.CommandBindings.Add(ClearTextCommandBinding);

            }

        }

        /**

         * 当命令触发的时候,会一级一级向上传递,当传递到命令关联者时,会处理这个命令

         */

        /// <summary>

        /// 创建一个命令

        /// </summary>

        public static RoutedUICommand ClearTextCommand{get;private set;}

        

        /// <summary>

        /// 命令绑定关联

        /// </summary>

        private static readonly CommandBinding ClearTextCommandBinding;

        private static void ClearButtonClick(object sender,ExecutedRoutedEventArgs e)

        {

            var tbox=e.Parameter as FrameworkElement;

            if(tbox==nullreturn;

            if(tbox is TextBox)

            {

                ((TextBox)tbox).Clear();

            }

            tbox.Focus();

        }

        #endregion

        static ControlAttachProperty()

        {

            ClearTextCommand = new RoutedUICommand();

            ClearTextCommandBinding =new CommandBinding();

            //将者命令加入到这个命令关联中,如果某个控件调用了这个命令,只要他所在的层级中有关联这个命令关联对象,那么这个命令对象就会对其进行处理

            ClearTextCommandBinding.Command = ClearTextCommand;

            ClearTextCommandBinding.Executed+=ClearButtonClick;

        }

    }

}

  

在布局文件中使用它


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

<Window x:Class="Demo3.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:c="clr-namespace:Demo3.Control"

        Background="Black"

        Title="MainWindow"

        WindowStartupLocation="CenterScreen"

        Height="350"

        Width="525">

    <StackPanel>

        <TextBox x:Name="UserName"

                 Width="230"

                 Height="38"

                 Margin="0,20,0,0"

                 FontSize="18"

                 VerticalContentAlignment="Center"

                 c:ControlAttachProperty.CornerRadius="5"

                 c:ControlAttachProperty.UserNameWaterMark="用户名"

                 c:ControlAttachProperty.UserIcon="{StaticResource UserName_BG}"

                 c:ControlAttachProperty.UserIconPress="{StaticResource UserName_BG_Press}"

                 c:ControlAttachProperty.DeleteButtonBG="{StaticResource Delete_Button_BG}"

                 c:ControlAttachProperty.IsVisiblityPassword="false"

                 Style="{StaticResource IconClearButtonTextBox}" />

        <TextBox x:Name="Password"

                 Width="230"

                 Height="38"

                 Margin="0,20,0,0"

                 FontSize="18"

                 VerticalContentAlignment="Center"

                 c:ControlAttachProperty.CornerRadius="5"

                 c:ControlAttachProperty.UserNameWaterMark="密码"

                 c:ControlAttachProperty.UserIcon="{StaticResource Password_BG}"

                 c:ControlAttachProperty.UserIconPress="{StaticResource Password_BG_Press}"

                 c:ControlAttachProperty.DeleteButtonBG="{StaticResource Delete_Button_BG}"

                 c:ControlAttachProperty.IsVisiblityPassword="true"

                 Style="{StaticResource IconClearButtonTextBox}" />

    </StackPanel>      

    

</Window>

  

在style文件中进行使用


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

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

                    xmlns:c="clr-namespace:Demo3.Control"

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

    

    <ResourceDictionary.MergedDictionaries>

        <ResourceDictionary Source="/Demo3;component/Resources/Style/DeleteButton.xaml" />

    </ResourceDictionary.MergedDictionaries>

    

    <!--TextBox默认样式-->

    <Style x:Key="DefaultTextBox" TargetType="{x:Type TextBox}">

        <Setter Property="ContextMenu" Value="{DynamicResource TextBoxContextMenu}" />

        <Setter Property="VerticalContentAlignment" Value="Center" />

        <Setter Property="SnapsToDevicePixels" Value="True" />

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type TextBox}">

                    <Border x:Name="Bg"

                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"

                            CornerRadius="{TemplateBinding c:ControlAttachProperty.CornerRadius}"

                            Background="White"

                            BorderBrush="Transparent"

                            BorderThickness="0">

                        <Grid x:Name="PART_InnerGrid">

                            <Grid.ColumnDefinitions>

                                <ColumnDefinition Width="30"/>

                                <ColumnDefinition />

                                <ColumnDefinition Width="40"/>

                            </Grid.ColumnDefinitions>

                            <!--用户头像区域-->

                            <ContentControl x:Name="UserIcon"

                                            Grid.Column="0"

                                            Margin="5"

                                            Template="{TemplateBinding c:ControlAttachProperty.IconTemplate}"

                                            Focusable="False" />

                            

                            <!--文本和水印-->

                            <ScrollViewer x:Name="PART_ContentHost"

                                          BorderThickness="0"

                                          Grid.Column="1"

                                          IsTabStop="False"

                                          Margin="2"

                                          VerticalAlignment="Stretch"

                                          Background="{x:Null}" />

                            <TextBlock x:Name="WaterMark"

                                       Grid.Column="1"

                                       VerticalAlignment="Center"

                                       Foreground="Silver"

                                       FontSize="18"

                                       Text="{TemplateBinding c:ControlAttachProperty.UserNameWaterMark}"

                                       Visibility="Collapsed"

                                       Padding="5,0,0,0" />

                            

                            <!-- 删除按钮-->

                            <ContentControl x:Name="DeleteIcon"

                                            Grid.Column="2"

                                            Width="15"

                                            Height="15"

                                            Margin="0,5,10,5"

                                            Visibility="Visible"

                                            VerticalAlignment="Center"

                                            HorizontalAlignment="Right"

                                            Template="{TemplateBinding c:ControlAttachProperty.AttachTemplate}"

                                            Focusable="False" />

                        </Grid>

                    </Border>

                    

                    <ControlTemplate.Triggers>

                        <!--当Text为空时,隐藏删除按钮-->

                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Text}" Value="">

                            <Setter Property="Visibility" TargetName="DeleteIcon" Value="Collapsed" />

                            <Setter Property="Visibility" TargetName="WaterMark" Value="Visible" />

                        </DataTrigger>

                        

                        <!--是否显示密码样式-->

                        <Trigger Property="c:ControlAttachProperty.IsVisiblityPassword" Value="True">

                            <Setter Property="Height" Value="30"/>

                            <Setter Property="Foreground" Value="Transparent"></Setter>

                            <Setter Property="FontSize" Value="20"></Setter>

                            <Setter Property="FontFamily" Value="Courier New"></Setter>

                            <Setter Property="TextDecorations">

                                <Setter.Value>

                                    <TextDecorationCollection>

                                        <TextDecoration>

                                            <TextDecoration.Pen>

                                                <Pen Thickness="10"

                                                     Brush="Black"

                                                     EndLineCap="Round"

                                                     StartLineCap="Round"

                                                     DashCap="Round"  >

                                                    <Pen.DashStyle>

                                                        <DashStyle Dashes="0.0,1.2" Offset="0.6"/>

                                                    </Pen.DashStyle>

                                                </Pen>

                                            </TextDecoration.Pen>

                                            <TextDecoration.Location>

                                                <TextDecorationLocation>Strikethrough</TextDecorationLocation>

                                            </TextDecoration.Location>

                                        </TextDecoration>

                                    </TextDecorationCollection>

                                </Setter.Value>

                            </Setter>

                        </Trigger>

                    </ControlTemplate.Triggers>

                </ControlTemplate>

            </Setter.Value>

        </Setter>

    </Style>

    

    <!--TextBox包含附加属性Icon,以及ClearText按钮的样式-->

    <Style x:Key="IconClearButtonTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource DefaultTextBox}">

        <!--设置用户头像模板-->

        <Setter Property="c:ControlAttachProperty.IconTemplate">

            <Setter.Value>

                <ControlTemplate TargetType="ContentControl">

                    <Grid>

                      <Image x:Name="Bg_HP"

                             Source="{Binding Path=(c:ControlAttachProperty.UserIcon),RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TextBox}}}"

                             Visibility="Visible"/>

                      <Image x:Name="Bg_HP_Press"

                             Source="{Binding Path=(c:ControlAttachProperty.UserIconPress),RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TextBox}}}"

                             Visibility="Collapsed" />

                    </Grid>

                    

                    <ControlTemplate.Triggers>

                        <DataTrigger Binding="{Binding IsFocused, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type TextBox}}}" Value="true">

                            <Setter Property="Visibility" TargetName="Bg_HP" Value="Collapsed" />

                            <Setter Property="Visibility" TargetName="Bg_HP_Press" Value="Visible" />

                        </DataTrigger>

                    </ControlTemplate.Triggers>

                </ControlTemplate>

            </Setter.Value>

        </Setter>

        <!--设置删除按妞模板-->

        <Setter Property="c:ControlAttachProperty.AttachTemplate">

            <Setter.Value>

                <ControlTemplate TargetType="ContentControl">

                    <c:DeleteButton ButtonBG="{Binding Path=(c:ControlAttachProperty.DeleteButtonBG),RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TextBox}}}"

                                    BorderBrush="Transparent"

                                    Style="{StaticResource DeleteButtonStyle}"

                                    BorderThickness="0"

                                    x:Name="CleanButton"

                                    c:ControlAttachProperty.IsClearTextButtonBehaviorEnabled="True"

                                    Command="c:ControlAttachProperty.ClearTextCommand"

                                    CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type TextBox}}}"

                                    Focusable="false" />

                    

                    <ControlTemplate.Triggers>

                        <DataTrigger Binding="{Binding Text,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type TextBox}}}" Value="">

                            <Setter Property="Visibility" TargetName="CleanButton" Value="Collapsed" />

                        </DataTrigger>

                    </ControlTemplate.Triggers>

                </ControlTemplate>

            </Setter.Value>

        </Setter>

    </Style>

</ResourceDictionary>

原文地址:https://www.cnblogs.com/lonelyxmas/p/9479063.html

时间: 2024-08-01 22:47:19

WPF 使用附加属性增加控件属性的相关文章

WPF利用通过父控件属性来获得绑定数据源RelativeSource

WPF利用通过父控件属性来获得绑定数据源RelativeSource 有时候我们不确定作为数据源的对象叫什么名字,但知道作为绑定源与UI布局有相对的关系,如下是一段XAML代码,说明多层布局控件中放置一个文本控件,来显示父级控件的名称. 1.XAML Html代码 <Grid x:Name="g1" Background="Red" Margin="10"> <DockPanel x:Name="d1" Ba

WPF Adorner+附加属性 实现控件友好提示

标题太空泛,直接上图 无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成. 例如WPF自带的控件上要加这样的效果,首先继承自原控件然后重写是可以的,但是控件类型太多,重写不过来.这个时候我们唯一能添加的只有附加属性了. 利用附加属性的属性变更事件PropertyChangedCallBack,我们可以获取到宿主对象即Button,然后就可以往Button上加入我们自定义的Adorner了.再添加一个附加属性

WPF编程,通过Double Animation动态更改控件属性的一种方法。

原文:WPF编程,通过Double Animation动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/87251422 DoubleAnimation类指定起始值(From="30").终点值(To="300").时间(Duration="3"),以及动画结束应该如何(FillBehavior="Stop&qu

WPF编程,通过【帧】动态更改控件属性的一种方法。

原文:WPF编程,通过[帧]动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/87249998 WPF提供了一种基于帧的动画实现方式,由CompositionTarget类来完成. WPF会在每次界面刷新时调用该回调函数. CompositionTarget的刷新率与窗体保持一致,因此很难人工控制动画的快慢. ?1.前台 <Grid> <Grid.RowDefin

WPF学习- AllowDrop 用户控件启用拖放功能

知识点: 创建自定义用户控件(UserControl) 使用户控件成为拖动源 使用户控件成为放置目标 使面板能够接收从用户控件放置的数据 创建项目: 1.新建WPF项目(Wpf-AllowDrop) 2.在MainWindow.xaml的 Grid控件添加源码 <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Sta

WPF 精修篇 用户控件

原文:WPF 精修篇 用户控件 增加用户控件 数据绑定还是用依赖属性 使用的事件 就委托注册一下 public delegate void ButtonClick(object b,EventArgs e); public event ButtonClick OnColorsClick ; private void Button_Click(object sender, RoutedEventArgs e) { if (OnColorsClick != null) { OnColorsClick

UITextField控件属性

UITextField控件属性: enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的. 1.borderStyle 设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBo

UISwitch控件属性

UISwitch控件属性: 1. onTintColor 处于on时switch 的颜色 switchImage.onTintColor = [UIColor grayColor]; 2.tintColor 处于off时switch 的颜色 switchImage.tintColor = [UIColor greenColor]; 3.onImage 设置on 的图标 switchImage.onImage = [UIImage imageNamed:@"1.png"]; 4. off

visual studio开发工具的C#主流控件属性一览表

visual studio开发工具的C#主流控件属性一览表 详细的介绍了各控制属性的详细中文介绍 C#控件及常用设计整理 1.窗体 1.常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体. (2) WindowState属性: 用来获取或设置窗体的窗口状态. 取值有三种: Normal (窗体正常显示). Minimized(窗体以最小化形式显示)和 Maximized(窗体以最大化形式显示). (3)StartPosition属性:用来获取或设置运