Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Получить цвет Border.


Автор: CasperSC 5.8.2010, 19:36
Здравствуйте. Вот пытаюсь получить цвет элемента Border. 

Код

<Window x:Class="MyProgram.WindowStiker"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WindowStiker" Height="217" Width="218" ResizeMode="NoResize" WindowStyle="None" BorderBrush="{x:Null}"
        Foreground="Black" AllowsTransparency="True" Background="{x:Null}" ShowInTaskbar="False" Opacity="1"
        TextOptions.TextFormattingMode="Ideal" TextOptions.TextRenderingMode="Aliased">
    <Grid>
        <Border BorderBrush="{x:Null}" BorderThickness="1" Name="borderBackground" CornerRadius="10" 
                MouseDown="border1_MouseDown" Opacity="0.7" Margin="2,2,3,3" Background="#FFCEE6FF">
            <Grid Height="Auto" Name="gridInBorderBackground" Width="Auto">
                <Grid.RowDefinitions>
                    <RowDefinition Height="30" />
                    <RowDefinition Height="152*" />
                </Grid.RowDefinitions>
                <Border BorderBrush="#FFEFEFEF" BorderThickness="0" Height="30" HorizontalAlignment="Stretch" Name="borderTop" 
                        VerticalAlignment="Top" Width="Auto" CornerRadius="10, 10, 0, 0" Opacity="1">
                    <Border.Background>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#6CB6D9E8" Offset="1" />
                            <GradientStop Color="#EA000000" Offset="0" />
                        </LinearGradientBrush>
                    </Border.Background>
                    <Grid Height="Auto" Name="gridBorderTop">
                    </Grid>
                </Border>
                <TextBlock Grid.Row="1" Margin="6" Name="textBlockMessage" Text="Привет!" FontSize="14"
                           TextAlignment="Center" TextWrapping="Wrap" TextTrimming="WordEllipsis" FontFamily="Segoe UI" />
            </Grid>
            <Border.Effect>
                <DropShadowEffect BlurRadius="7" Color="Black" Direction="310" ShadowDepth="1"/>
            </Border.Effect>
        </Border>
    </Grid>
</Window>



Код

        private void btnColorBorder_Click(object sender, RoutedEventArgs e)
        {
            ColorDialog colorDialog = new ColorDialog();
            colorDialog.Owner = this;
            Nullable<Boolean> result = colorDialog.ShowDialog();
            if (result == true)
            {
                settingsMsg.BorderMsgColor = colorDialog.SelectedColor;
                if (this.windowStiker != null)
                {
                    Color colorTop = new Color();
                    Color colorBottom = new Color();
                    colorTop = colorDialog.SelectedColor;

                    //Brush brushBackground = this.btnColorBorder.Background; //Не знаю что делать дальше, как получить цвет
                    
                    //colorTop = (Color)ColorConverter.ConvertFromString("#EA000000");
                    //colorBottom = (Color)ColorConverter.ConvertFromString("#6CB6D9E8");

                    SetBorderColorFor_Stiker(colorTop, colorBottom);
                }
            }
        }

        /// <summary>
        /// Установить цвет оборки окна сообщения
        /// </summary>
        /// <param name="colorGradientStopTop">Цвет верхней части градиента</param>
        /// <param name="colorGradientStopBottom">Цвет нижней части градиента</param>
        private void SetBorderColorFor_Stiker(Color colorGradientStopTop, Color colorGradientStopBottom)
        {
            GradientStopCollection gradientStopCollection = new GradientStopCollection(2);
            GradientStop gradientStop = new GradientStop(colorGradientStopTop, 0d);
            GradientStop gradientStop2 = new GradientStop(colorGradientStopBottom, 1.0d);
            gradientStopCollection.Add(gradientStop);
            gradientStopCollection.Add(gradientStop2);

            Point start = new Point(0.5, 0);
            Point end = new Point(0.5, 1);
            LinearGradientBrush br = new LinearGradientBrush(gradientStopCollection, start, end);
            this.windowStiker.borderTop.Background = br;
        }


Вообще суть такая: есть окно с сообщением, верхняя его часть должна плавно переходить в цвет основной части окна.  То есть в метод SetBorderColor нужно в качестве параметров передавать выбранный цвет (colorGradientStopTop) и цвет основной части окна, конкретно Border'a растянутого на всё окно (colorGradientStopBottom)

Что-то типа этого:
user posted image

Автор: Kefir 5.8.2010, 23:11
Раз у тебя одноцветная заливка бордера, то это делается так:
Код

SolidColorBrush brushBackground = (SolidColorBrush)this.btnColorBorder.Background;
Color theColorIReallyNeed = brushBackground.Color;

Автор: CasperSC 5.8.2010, 23:57
Хм, сейчас попробовал получилось. Но я сам делал точно также и у меня вылетело исключение, что не получается преобразовать в Brush в SolidColorBrush, сейчас работает. Может быть я тогда допустил ошибку, не знаю.

А нет, вылетело исключение:
System.InvalidCastException не обработано пользовательским кодом
  Message=Не удалось привести тип объекта "System.Windows.Media.LinearGradientBrush" к типу "System.Windows.Media.SolidColorBrush".


На строчке:
Код

SolidColorBrush brushBackground = (SolidColorBrush)this.btnColorBorder.Background;

Автор: Kefir 6.8.2010, 09:13
Если у тебя у бордера поставлена заливка сплошным цветом, то тогда Background будет типа SolidColorBrush (я так понял из первого поста). Если же ты поменял заливку со сплошного цвета на градиент, тогда заливка будет типа GradientBrush (если точнее, то или LinearGradientBrush или RadialGradientBrush, унаследованные от GradientBrush - так что приводить лучше к GradientBrush):

Код

            GradientBrush gb = (GradientBrush)this.btnColorBorder.Background;
            Color c = gb.GradientStops[0].Color;


GradientStops содержит все остановки градиента, среди которых просто по индексу выбирай свой цвет (у меня в примере я получаю цвет первой остановки градиента).

Если же у тебя могут быть оба варианта (одноцветная заливка или же градиент), то можно просто сделать проверку типа:
Код

Color myColor = null;
if(this.btnColorBorder.Background is SolidColorBrush)
{
            myColor = (this.btnColorBorder.Background as SolidColorBrush).Color;
}
else if(this.btnColorBorder.Background is GradientBrush)
{
            myColor = (this.btnColorBorder.Background as GradientBrush).GradientStops[0].Color;
}


Опять же - замени индекс [0] на нужный тебе.

Автор: CasperSC 6.8.2010, 11:08
Спасибо за помощь, попробовал сделать приведение  к градиент браш, дык смотрю у меня там 4 градиент стопа, я аж удивился, думаю 
откуда, ведь заливаю border сплошным цветом, оказалось я перепутал название, вот так работает всё нормально:
Код

                    SolidColorBrush brushBackground = (SolidColorBrush)this.windowStiker.borderBackground.Background;
                    colorBottom = brushBackground.Color;


Было: this.btnColorBorder.Background;
Сейчас: this.windowStiker.borderBackground.Background;

Мде, вот это невнимательно я написал, что аж весь вчерашний день недоумевал, почему не работает, когда должно работать.

Автор: exBlender 6.8.2010, 19:59
Если о сути, то она вообще такая: никакого мусора с описанием цветов или размеров в C# коде быть не должно.
В xaml создаются различные стили Border'ов, а команда из кода только меняет один стиль на другой.

Автор: CasperSC 7.8.2010, 07:39
Цитата(exBlender @ 6.8.2010,  19:59)
Если о сути, то она вообще такая: никакого мусора с описанием цветов или размеров в C# коде быть не должно.
В xaml создаются различные стили Border'ов, а команда из кода только меняет один стиль на другой.

Тогда получается, мне нужно очень много стилей сделать. Так как я зделал возможность стиль сообщения изменить как угодно пользователю, на любые цвета и прозрачность.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)