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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> После стирания прямоугольника остаётся рамка 
:(
    Опции темы
Cheloveck
Дата 8.3.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



На днях начал изучать WPF. Вот столкнулся с непонятностью. Беру Image, DrawingVisual и RenderTargetBitmap. Битмап задаю источником в Image и рендерю в него фон и прямоугольник с рамкой. Далее я хочу стереть прямоугольник и рисую такой же, но цветом фона. Полупрозрачная рамка остаётся. Эта рамка за пределами моего прямоугольника. Image имеет свойство Stretch равное None.

Код
Код

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Image Name="image"
               Margin="12,12,0,41" 
               Stretch="None"/>
        <Button Name="btnDraw"
                Content="Draw" 
                Height="23"
                HorizontalAlignment="Left"
                Margin="12,276,0,0"
                VerticalAlignment="Top"
                Width="75" Click="btnDraw_Click" />
        <Button Name="btnErase"
                Content="Erase"
                Height="23"
                HorizontalAlignment="Left"
                Margin="93,276,0,0"
                VerticalAlignment="Top"
                Width="75" Click="btnErase_Click" />
    </Grid>
</Window>


Код

    public partial class MainWindow : Window
    {
        RenderTargetBitmap bmp;
        DrawingVisual visual;

        public MainWindow()
        {
            InitializeComponent();
            bmp = new RenderTargetBitmap(150, 150, 0, 0, PixelFormats.Default);
            visual = new DrawingVisual();
            DrawingContext dc = visual.RenderOpen();
            dc.DrawRectangle(Brushes.Gray, null, new Rect(0, 0, 150, 150));
            dc.Close();
            bmp.Render(visual);
            image.Source = bmp;
        }

        private void btnDraw_Click(object sender, RoutedEventArgs e)
        {
            DrawingContext dc = visual.RenderOpen();
            dc.DrawRectangle(Brushes.Red, new Pen(Brushes.Green, 1.0),
                new Rect(10, 10, 130, 130));
            dc.Close();
            bmp.Render(visual);
        }

        private void btnErase_Click(object sender, RoutedEventArgs e)
        {
            DrawingContext dc = visual.RenderOpen();
            dc.DrawRectangle(Brushes.Gray, new Pen(Brushes.Gray, 1.0),
                new Rect(10, 10, 130, 130));
            dc.Close();
            bmp.Render(visual);

        }
    }

Вот такой результат после стирания имеем
user posted image
Вопрос, какого как сделать, чтобы было хорошо?

Это сообщение отредактировал(а) Cheloveck - 8.3.2011, 22:24


--------------------
user posted image
PM Jabber   Вверх
-Mikle-
Дата 9.3.2011, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Линии в WPF это не просто закрашенные пикселы в единицу толщиной. В WPF используется сабпиксельная прорисовка, которая слева, справа, сверху и снизу линии рисует еще антиалиасинговые пикселы. Думаю именно они и остаются после "стирания". Запустите экранную лупу и внимательно исследуйте это место, скорее всего именно это вы и заметите.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Cheloveck
Дата 9.3.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



-Mikle-, именно про них я и говорю. Вопрос не в том, что это, а как от этого избавиться?


--------------------
user posted image
PM Jabber   Вверх
-Mikle-
Дата 9.3.2011, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Рисуйте фон, а не линию с цветом фона.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
exBlender
Дата 9.3.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Cheloveck @ 8.3.2011,  15:17)
На днях начал изучать WPF
...
Вопрос, какого как сделать, чтобы было хорошо?

Если хотите делать по-хорошему, сначала из кода переместите всю визуализацию в xaml.
Это может выглядеть примерно так:
Код

...
    <Window.Resources>
        <SolidColorBrush x:Key="ImageBorderBackground" Color="Gray"/>
        <SolidColorBrush x:Key="BorderBrush1" Color="Green"/>
        <SolidColorBrush x:Key="BorderBrush2" Color="Red"/>
        <SolidColorBrush x:Key="BorderBrush3" Color="Transparent"/>
        <Style x:Key="ImageBorder1" TargetType="Border">
            <Setter Property="Background" Value="{StaticResource ImageBorderBackground}" />
            <Setter Property="BorderBrush" Value="{StaticResource BorderBrush1}" />
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="Height" Value="150" />
            <Setter Property="Width" Value="150" />
        </Style>
        <Style x:Key="ImageBorder2" TargetType="Border" BasedOn="{StaticResource ImageBorder1}">
            <Setter Property="BorderBrush" Value="{StaticResource BorderBrush2}" />
        </Style>
        <Style x:Key="ImageBorder3" TargetType="Border" BasedOn="{StaticResource ImageBorder1}">
            <Setter Property="BorderBrush" Value="{StaticResource BorderBrush3}" />
        </Style>
    </Window.Resources>

    <Grid>
        <Border x:Name="ImageContainer" Style={...} Margin="12,12,0,41">
              <Image Name="image" Stretch="None"/>
        </Border>
        ...
    </Grid>


Кодом только меняете один стиль Border'a на другой.
--------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт.
PM MAIL   Вверх
-Mikle-
Дата 9.3.2011, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



exBlender, мне показалось, что человек изучает возможности програмной отрисовки. Редкая нужда конечно, но знать и понимать ее стоит.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Cheloveck
Дата 9.3.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



exBlender
Цитата(-Mikle- @  9.3.2011,  18:52 Найти цитируемый пост)
человек изучает возможности програмной отрисовки

Мне нужно динамически рисовать такие квадратики в количестве n, заранее неизвестных, штук. Создавать для каждого объект - расточительство ресурсов, как со стороны выделения памяти, так и со стороны контроля за всеми объектами.

Это сообщение отредактировал(а) Cheloveck - 9.3.2011, 19:24


--------------------
user posted image
PM Jabber   Вверх
exBlender
Дата 9.3.2011, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спорить не буду.

Но хозяйке на заметку:
В реальной жизни тормоза обычно возникают при загрузке из базы данных, а не из-за использования бордеров. Разделение кода и визуала - краеугольный камень WPF. Я сижу на довольно большом проекте, где пробовали многих программистов и всех, кто не очень четко работал с MVVM и не выносил визуал из кода, убрали.

--------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт.
PM MAIL   Вверх
-Mikle-
Дата 9.3.2011, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(Cheloveck @  9.3.2011,  22:22 Найти цитируемый пост)
Мне нужно динамически рисовать такие квадратики в количестве n

Вы хоть в курс дела введите, вам это надо для практических целей или ради учебных целей? Для практических, я вам тоже не рекомендую заниматься ручной работой. А расточительство памяти решается в два счета разными способами.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Cheloveck
Дата 9.3.2011, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



Цитата(-Mikle- @  9.3.2011,  21:54 Найти цитируемый пост)
для практических целей или ради учебных целей?

Для учебных. Как бы ни было лучше, это делаться тоже должно. Иначе это не фреймворк, а ***** какая-то.


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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