Сообщения

Показаны сообщения с ярлыком "WPF"

WPF Tips: Не доверяйте ложной модальности MessageBox.Show - ее надо заслужить.

Если вы расчитываете на модальности MessageBox.Show, то должен заметить, что ее легко обойти, есил MessageBox.Show("текст") вызывается в момент, когда приложение не активно. После этого вы можете закрыть окно приложения или выполнить на нем какие-либо действия, и MessageBox, как обычно, не помешает вам это сделать. Это можно поправить, всегда передавая нужное вам окно в перегрузки метода MessageBox.Show, где первым параметром принимается объект класса Window. Только учтите следующие замечания: Нельзя передать null в эти перегруженные методы. Если вам кажется неправильным тащить за собой целевое окно и вы захотите использовать Application.Current.MainWindow, то учтите, что там может быть null, если еще ни одного окна не открывалось или вы сами можете где-то в коде задать Application.Current.MainWindow = null;, а MessageBox.Show при этом порвет (выпадет на исключении)! Нужет будет утильный метод который проверяет Application.Current.MainWindow на null и вызывает перегрузку ...

WPF/Silverlight Tips: Коварное статическое свойствоDispatcher.CurrentDispatcher - не используйте.

Не используйте свойство Dispatcher.CurrentDispatcher!!! Или - используйте его по назначению, что фактически означает - "не используйте его никогда, чтоб не попасть в просак". Вместо него нужно использовать В WPF - Application .Current.Dispatcher . В Silverlight -  Deployment .Current.Dispatcher . Дело в том, что Dispatcher.CurrentDispatcher вернет диспатчер для текущего потока или создаст новый для потока, в котором нет еще диспатчера. Если вы работаете в потоке вашего UI, то все о.к., вы получите Dispatcher вашего UI-приложения. Но если вы работаете во внешнем потоке, то вы получите диспатчер, который никак не связан с вашими UI элементами и окнами и вы никогда не достучитесь до ваших гуев. Можно поймать неприятные баги, особенно при активном рефакторинге чужого кода. Универсальное решение для всех фреймворков SynchronizationContext .Current

WPF: Баг проекта WPF в Visual Studio при работе с ресурсными файлами.

Речь о проекте WPF в Visual Studio.   Есть файлы которые компилируются в сборку. Ресурсные файлы. У них в свойствах в Build Action стоит Resource. С ними нужно быть осторожным, т.к. при удалении такого файла из проекта или при изменении Build Action на None ничего не меняется. Грубо говоря этот файл останется у вас в ресурсе. Возможно если вы подмените этот файл, то новый файл не подхватиться (не пробовал).   Для решения этой проблемы, после каждого изменения с ресурсными файлами, выполните очистку проекта или всего солюшена - Clean из контекстного меню в Solution Explorer. Только тогда все подхвытывается корректно, иначе вы можете получить исключение при обращении к ресурсу или ненужное утяжеление проекта ресурсными файлами, которые более не нужны.   Видел это в VS 2008, в 2010 не пробовал. Я думаю это относится не только к проектам WPF.

WPF-серия. Прокрутка окна с замораживанием главного меню и вкладоквверху / внизу страницы

(Этот пост только для меня родного, т.к. боюсь я тут не совсем хорошо объяснил этот трюк из мира WEB) Не смог найти встроенный стандартный способ фиксации верхнего меню окна / страницы в WPF, так, чтоб весь остальной контент можно было прокручивать. Немного поколдовал и сделал через биндинг, свойство зависимости и расчет размера (высота страницы минус высота меню и для ширины так же). Получилось идеально и красиво, но может вы знаете стандартные подходы, как этого добиться.

AutoCompleteBox has problem with items with same name

Русский заглоловок: Проблема выбора в AutoCompleteBox объектов с одинаковым свойством. Поблема: при отображении в AutoCompleteBox объектов, которые имеют одинаковые поля, AutoCompleteBox всегда будет выбирать только первый найденный (всегда один и тот же) объект из всех объектов с одинанковым полем. И это не смотря на то, что в выпадающем списке (выпадающей области) мы может отобразить любые нужные поля объекта сразу или даже DataGrid и увидеть отличия объектов. Вот сразу простое и быстрое решение: private void someInit() {     completeBox.SelectionChanged += AbonentsAutoCompleteBox_SelectionChanged;     completeBox.Populated += new PopulatedEventHandler(completeBox_Populated); } void completeBox_Populated(object sender, PopulatedEventArgs e) {     var completeBox = sender as AutoCompleteBox;     completeBox.Tag = null; } private void AbonentsAutoCompleteBox_SelectionChanged(object sender, SelectionChangedEventArgs e) {...

WPF: DataGrid в WPF не поддерживает полноценной работы с валидацией, в отличии от Silverlight DataGrid

На данный момент я не нашел способа программно в UI (!!! а не в бизнес объектах) определить, валидны ли строки или ячейки в DataGrid WPF. Стандартные уловки с LogicalTreeHelper.GetChildren(...) и Validation.GetHasError(...) на теперешнем июльском 2009 DataGrid не работают. А вот разработчики Silverlight Toolkit такого промоха не допустили. Вот и пригодился мой подход с самопальными Validation Groups как у ASP.NET, который я притянул в WPF и о котором писал ранее. Так что, не все так хорошо в датском королевстве :) Но ждем лучшего, т.к. .NET Framework 4 не загорами.

Задание прикрепленного свойства в XALM. Set Attached Properties in XALM.

Сразу несколько примеров, чтоб все стало ясно Вот эту запись: <Button Grid.Row=”1”>     <TextBlock>1234567890</TextBlock> </Button> Можно записать так: <Button>     <Grid.Row>         1     </Grid.Row>     <TextBlock>1234567890</TextBlock> </Button> Пример из жизни: <Border>     <vsm:VisualStateManager.VisualStateGroups>         <vsm:VisualStateGroup x:Name="CommonStates">             <vsm:VisualState x:Name="Normal" />         </vsm:VisualStateGroup>     </vsm:VisualStateManager.VisualStateGroups> </Border> Т.е. помимо задания прекрепленных свойств через атрибуты, их можно задавать в нодах XALM. Это очень хорошо пригодиться при кастом...

WPF-серия. Группы валидации в WPF

Пока разбирался с валидацией в WPF успел создать функционал групп валидации, наподобии ASP.NET. Сделал свои ананлог, но теперь, честно говоря, досканально поняв и поработав с валидацией в WPF и Silverlight, я бы сделал группы валидации по другому, а может и не стал бы делать вообще. Слишком большое поле для кастомизации, что-бы еще притаскивать на это “поле” группы валидации.  

Выделение любого текста в GUI Silverlight и WPF

Задача сделать пользовательский интерфейс, в котором, как в браузере можно выделять любой текст. Другими словами, чтоб любой текст на экране можно было выделить, а не талько в элементах для ввода текста. В WPF для этого используется немного настроенный TextBox со свойством IsReadOnly=”true” Используется следующий стиль <Style x:Key="Texted" TargetType="TextBox"> <Setter Property="IsReadOnly" Value="True" /> <Setter Property="BorderThickness" Value="0" /> <Setter Property="Background" Value="Transparent" /> <Setter Property="IsTabStop" Value="False" /> </Style> В Silverlight 3 этот фокус теперь не пройдет, тк появилось закрашивание серым цветом если IsReadOnly=”true” Решается это следующим кастомным стилем (например разместите его в App.xaml в ResourceDictionary) <Style x:Key="OnlySelectedTextBox" TargetType="TextBox"> <Sett...

Размещение строки создания (наполнения) нового элемента первой строкой в DataGrid WPF Toolkit.

По умолчанию строка для добавления/наполнения нового элемента расположена внизу DataGrid WPF. Для её размещения сверху нужно обратиться к представлению по умолчанию для коллекции, которая будет привязана к DataGrid, привести его к IEditableCollectionView (представлению для редактирования) и задать соответствующий параметр NewItemPlaceholderPosition. Вот как это выглядит в коде: var view = (IEditableCollectionView)CollectionViewSource.GetDefaultView(productGroups); view.NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning; Добавьте этот код после создания привязываемой коллекции, можно, даже, до ее наполнения. Вот как-то так :) Взято из WPF DataGrid – New Item Template Sample .