Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить цвет Border. 
V
    Опции темы
CasperSC
Дата 5.8.2010, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



Здравствуйте. Вот пытаюсь получить цвет элемента 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

Это сообщение отредактировал(а) CasperSC - 5.8.2010, 23:56
PM MAIL   Вверх
Kefir
Дата 5.8.2010, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 22
Всего: 87



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

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

PM MAIL WWW Skype   Вверх
CasperSC
Дата 5.8.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



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

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


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

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


Это сообщение отредактировал(а) CasperSC - 6.8.2010, 00:04
PM MAIL   Вверх
Kefir
Дата 6.8.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 22
Всего: 87



Если у тебя у бордера поставлена заливка сплошным цветом, то тогда 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] на нужный тебе.
PM MAIL WWW Skype   Вверх
CasperSC
Дата 6.8.2010, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



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

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


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

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

Это сообщение отредактировал(а) CasperSC - 6.8.2010, 20:11
PM MAIL   Вверх
exBlender
Дата 6.8.2010, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.10.2009

Репутация: 9
Всего: 9



Если о сути, то она вообще такая: никакого мусора с описанием цветов или размеров в C# коде быть не должно.
В xaml создаются различные стили Border'ов, а команда из кода только меняет один стиль на другой.
--------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт.
PM MAIL   Вверх
CasperSC
Дата 7.8.2010, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



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

Тогда получается, мне нужно очень много стилей сделать. Так как я зделал возможность стиль сообщения изменить как угодно пользователю, на любые цвета и прозрачность.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.