如何在代码中设置按钮的内部属性?

[英]How do I set a button's inner properties in code?


I have an XAML button like this:

我有一个像这样的XAML按钮:

<Button x:Name="buttonOK" Content="OK" />

I have no XAML styling attached to it and no resource dictionary styling it. No external thing is styling my button and that is fine; that is how I want it.

我没有附加XAML样式,也没有资源字典样式。没有外在的东西造型我的按钮,这很好;这就是我想要的。

I want, now, to change the RadiusX and RadiusY of that button in code behind, because I want a button with rounded edges. I know System.Windows.Controls.Button does not have those properties, but I know a WPF rectangle does.

我现在想要在后面的代码中更改该按钮的RadiusX和RadiusY,因为我想要一个带有圆边的按钮。我知道System.Windows.Controls.Button没有这些属性,但我知道一个WPF矩形。

I don't know if this is correct; but the WPF button control is made up of other controls? Right? Like perhaps a rectangle and a text block or label and by setting the Button.Content you're actually changing the button's inner label's content. I'm not sure how naive my thinking is there.

我不知道这是否正确;但WPF按钮控件是由其他控件组成的?对?就像一个矩形和一个文本块或标签,通过设置Button.Content,你实际上是在改变按钮的内部标签的内容。我不确定我的想法有多天真。

The bottom line is I want to do something like this:

底线是我想做这样的事情:

buttonOK.InnerRectangle.RadiusX = 5;
buttonOK.InnerRectangle.RadiusY = 5;

I want it all in code, no XAML, because I have many buttons in different XAML files and I want to round their edges by calling one method in code without changing every single XAML file. Not all buttons in all my XAML files, just certain ones.

我想要所有代码,没有XAML,因为我在不同的XAML文件中有很多按钮,我想通过在代码中调用一个方法而不改变每个XAML文件来绕过它们的边缘。并非我所有XAML文件中的所有按钮,只有某些按钮。

I'm already calling a single method in all my windows and user controls and I just want to add the button rounding edges styling to that method, and then it won't cause tedious code.

我已经在我的所有窗口和用户控件中调用了一个方法,我只想添加圆形边缘样式的按钮到该方法,然后它不会导致繁琐的代码。

1 个解决方案

#1


12  

Load XAML from a string to a Style object that allows to change the corner radius in code and then set the button style.

将XAML从字符串加载到Style对象,该对象允许更改代码中的角半径,然后设置按钮样式。

This is the code that worked for me:

这是适合我的代码:

        // OK
        private void buttonOK_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                SetButtonCornerRadiusAndTriggerStyling(buttonOK, 5);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error at 'buttonOK_Click'" + Environment.NewLine + Environment.NewLine + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        // Set button corner radius and trigger styling
        public static void SetButtonCornerRadiusAndTriggerStyling(
            Button toStyle, int theCornerRadius,
            string theMouseOverBackground = "", string theMouseOverBorderBrush = "", string theMouseOverForeground = "",
            string thePressedBackground = "", string thePressedBorderBrush = "", string thePressedForeground = "",
            string theDisabledBackground = "", string theDisabledBorderBrush = "", string theDisabledForeground = "")
        {
            try
            {
                // Corner radius
                int cornerRadius = theCornerRadius;

                // Mouse over
                string defaultMouseOverBackground = "#BEE6FD";
                string defaultMouseOverBorderBrush = "#3C7FB1";
                string defaultMouseOverForeground = "Black";

                string mouseOverBackground = theMouseOverBackground;
                string mouseOverBorderBrush = theMouseOverBorderBrush;
                string mouseOverForeground = theMouseOverForeground;

                if (mouseOverBackground == null) { mouseOverBackground = ""; }
                if (mouseOverBorderBrush == null) { mouseOverBorderBrush = ""; }
                if (mouseOverForeground == null) { mouseOverForeground = ""; }

                if (mouseOverBackground.Length == 0) { mouseOverBackground = defaultMouseOverBackground; }
                if (mouseOverBorderBrush.Length == 0) { mouseOverBorderBrush = defaultMouseOverBorderBrush; }
                if (mouseOverForeground.Length == 0) { mouseOverForeground = defaultMouseOverForeground; }

                // Pressed
                string defaultPressedBackground = "#C4E5F6";
                string defaultPressedBorderBrush = "#2C628B";
                string defaultPressedForeground = "Black";

                string pressedBackground = thePressedBackground;
                string pressedBorderBrush = thePressedBorderBrush;
                string pressedForeground = thePressedForeground;

                if (pressedBackground == null) { pressedBackground = ""; }
                if (pressedBorderBrush == null) { pressedBorderBrush = ""; }
                if (pressedForeground == null) { pressedForeground = ""; }

                if (pressedBackground.Length == 0) { pressedBackground = defaultPressedBackground; }
                if (pressedBorderBrush.Length == 0) { pressedBorderBrush = defaultPressedBorderBrush; }
                if (pressedForeground.Length == 0) { pressedForeground = defaultPressedForeground; }

                // Disabled
                string defaultDisabledBackground = "#F4F4F4";
                string defaultDisabledBorderBrush = "#ADB2B5";
                string defaultDisabledForeground = "#83838C";

                string disabledBackground = theDisabledBackground;
                string disabledBorderBrush = theDisabledBorderBrush;
                string disabledForeground = theDisabledForeground;

                if (disabledBackground == null) { disabledBackground = ""; }
                if (disabledBorderBrush == null) { disabledBorderBrush = ""; }
                if (disabledForeground == null) { disabledForeground = ""; }

                if (disabledBackground.Length == 0) { disabledBackground = defaultDisabledBackground; }
                if (disabledBorderBrush.Length == 0) { disabledBorderBrush = defaultDisabledBorderBrush; }
                if (disabledForeground.Length == 0) { disabledForeground = defaultDisabledForeground; }

                string mainButtonStyleXAML = @"<Style xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' TargetType=""Button"">


    <Setter Property=""Template"">
        <Setter.Value>
            <ControlTemplate TargetType=""ButtonBase"">
                <Border
                    BorderThickness=""{TemplateBinding Border.BorderThickness}""
                    BorderBrush=""{TemplateBinding Border.BorderBrush}""
                    Background=""{TemplateBinding Panel.Background}""
                    Name=""BorderMain""
                    CornerRadius=""{CornerRadius}""
                    SnapsToDevicePixels=""True"">

                    <ContentPresenter
                        RecognizesAccessKey=""True""
                        Content=""{TemplateBinding ContentControl.Content}""
                        ContentTemplate=""{TemplateBinding ContentControl.ContentTemplate}""
                        ContentStringFormat=""{TemplateBinding ContentControl.ContentStringFormat}""
                        Name=""ContentPresenterMain""
                        Margin=""{TemplateBinding Control.Padding}""
                        HorizontalAlignment=""{TemplateBinding Control.HorizontalContentAlignment}""
                        VerticalAlignment=""{TemplateBinding Control.VerticalContentAlignment}""
                        SnapsToDevicePixels=""{TemplateBinding UIElement.SnapsToDevicePixels}""
                        Focusable=""False"" />
                </Border>

            <ControlTemplate.Triggers>

                <!-- Default -->
                <Trigger Property=""Button.IsDefaulted"" Value=""True"">
                    <Setter Property=""Border.BorderBrush"" TargetName=""BorderMain"">
                        <Setter.Value>
                            <DynamicResource
                                ResourceKey=""{x:Static SystemColors.HighlightBrushKey}"" />
                        </Setter.Value>
                    </Setter>
                </Trigger>

                <!-- Mouse Over -->
                <Trigger Property=""UIElement.IsMouseOver"" Value=""True"">
                    <Setter Property=""Panel.Background"" TargetName=""BorderMain"">
                        <Setter.Value>
                            <SolidColorBrush>{MouseOverBackground}</SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter Property=""Border.BorderBrush"" TargetName=""BorderMain"">
                        <Setter.Value>
                            <SolidColorBrush>{MouseOverBorderBrush}</SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter Property=""TextElement.Foreground"" TargetName=""ContentPresenterMain"">
                        <Setter.Value>
                            <SolidColorBrush>{MouseOverForeground}</SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                </Trigger>

                <!-- Pressed -->
                <Trigger Property=""ButtonBase.IsPressed"" Value=""True"">
                    <Setter Property=""Panel.Background"" TargetName=""BorderMain"">
                        <Setter.Value>
                            <SolidColorBrush>{PressedBackground}</SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter Property=""Border.BorderBrush"" TargetName=""BorderMain"">
                        <Setter.Value>
                            <SolidColorBrush>{PressedBorderBrush}</SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter Property=""TextElement.Foreground"" TargetName=""ContentPresenterMain"">
                        <Setter.Value>
                            <SolidColorBrush>{PressedForeground}</SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                </Trigger>

                <!-- Disabled -->
                <Trigger Property=""UIElement.IsEnabled"" Value=""False"">
                    <Setter Property=""Panel.Background"" TargetName=""BorderMain"">
                        <Setter.Value>
                            <SolidColorBrush>{DisabledBackground}</SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter Property=""Border.BorderBrush"" TargetName=""BorderMain"">
                        <Setter.Value>
                            <SolidColorBrush>{DisabledBorderBrush}</SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter Property=""TextElement.Foreground"" TargetName=""ContentPresenterMain"">
                        <Setter.Value>
                            <SolidColorBrush>{DisabledForeground}</SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                </Trigger>

            </ControlTemplate.Triggers>

            </ControlTemplate>
        </Setter.Value>
    </Setter>

</Style>";



                // Replace values
                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{CornerRadius}", cornerRadius.ToString());

                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{MouseOverBackground}", mouseOverBackground);
                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{MouseOverBorderBrush}", mouseOverBorderBrush);
                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{MouseOverForeground}", mouseOverForeground);

                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{PressedBackground}", pressedBackground);
                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{PressedBorderBrush}", pressedBorderBrush);
                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{PressedForeground}", pressedForeground);

                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{DisabledBackground}", disabledBackground);
                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{DisabledBorderBrush}", disabledBorderBrush);
                mainButtonStyleXAML = mainButtonStyleXAML.Replace("{DisabledForeground}", disabledForeground);

                StringReader mainButtonStyleXAMLStringReader = new StringReader(mainButtonStyleXAML);
                XmlReader mainButtonStyleXAMLXMLReader = XmlReader.Create(mainButtonStyleXAMLStringReader);
                Style mainButtonStyle = (Style)XamlReader.Load(mainButtonStyleXAMLXMLReader);

                toStyle.Style = mainButtonStyle;
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    "Error at 'SetButtonCornerRadiusAndTriggerStyling'" +
                        Environment.NewLine + Environment.NewLine +
                        ex.Message,
                    "Error",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error);
            }
        }

So I had to put XAML in code, because FrameworkElementFactory is apparently deprecated.

所以我必须将XAML放在代码中,因为FrameworkElementFactory显然已被弃用。

MSDN:

MSDN:

https://msdn.microsoft.com/en-us/library/system.windows.frameworkelementfactory(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.windows.frameworkelementfactory(v=vs.110).aspx

Under remarks:

在评论中:

"This class is a deprecated way to programmatically create templates, which are subclasses of FrameworkTemplate such as ControlTemplate or DataTemplate; not all of the template functionality is available when you create a template using this class. The recommended way to programmatically create a template is to load XAML from a string or a memory stream using the Load method of the XamlReader class."

“这个类是以编程方式创建模板的一种不推荐使用的方式,模板是FrameworkTemplate的子类,例如ControlTemplate或DataTemplate;当您使用此类创建模板时,并非所有模板功能都可用。建议的以编程方式创建模板的方法是使用XamlReader类的Load方法从字符串或内存流加载XAML。“


注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:http://www.itdaan.com/blog/2018/07/13/16de4e6595f92c194d80eb88548239a4.html



 
© 2014-2018 ITdaan.com 粤ICP备14056181号