В частности, я хочу использовать 16 * 16 32-битных изображений PNG, включенных в VS2008ImageLibrary. Я пробовал вручную установить атрибуты высоты и ширины изображения, отрегулировать поля и отступы, отрегулировать Stretch и RenderOptions. Все мои попытки создать кнопки панели инструментов привели либо к неправильному масштабированию (размытые значки), либо к усечению нижнего ряда пикселей на значке, либо к неправильному размеру кнопки панели инструментов - не говоря уже об исчезнувших значках, о которых уже упоминалось Здесь. Кто-нибудь нашел лучший способ сделать стандартные кнопки панели инструментов в стиле VisualStudio / WinForms, которые правильно отображаются в WPF?
В WPF, как лучше всего создавать кнопки панели инструментов, чтобы изображения правильно масштабировались?
Ответы:
Сначала измените разрешение изображения на 96DPI, это можно сделать с помощью бесплатного Paint.net (http://www.getpaint.net), открыв файл, выбрав в меню «Изображение»> «Размер холста», установив «разрешение» на 96 и сохранив.
Если это не помогает, вы можете использовать решение, о котором я писал в своем блоге здесь http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx
Лучше всего использовать векторную графику вместо png. Я знаю, что это не совсем то, о чем вы просили, но имхо нет способа улучшить вид иконок. Также это поможет вам избавиться от полей и отступов. (Хорошо, если вы хотите использовать фотографии, вы облажались)
Плохие новости - вам, вероятно, нужно перекрасить все свои значки. Вы можете сделать это с помощью MS Expression Blend (он может сохранять нарисованные изображения как .xaml) или сделать их самостоятельно с помощью текстового редактора. Я предпочитаю Border.Background вместо Image.Source для размещения значка, это позволяет мне помещать текст поверх изображения. Это выглядело бы примерно так:
<Window.Resources>
<ResourceDictionary Source="Resources/Icons.xaml"/>
</Window.Resources>
<!--
...
-->
<Button>
<Border Background="{StaticResource IconName}" Height="16" Width="16" />
</Button>
Лучшее решение, которое я могу придумать, это следующее:
<Image x:Key="TB_NewIcon" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
...
<Button Command="ApplicationCommands.New" Content="{StaticResource TB_NewIcon}" Padding="2,2,2,1"/>
Или альтернативно:
<BitmapImage x:Key="TB_NewIcon" UriSource="Toolbar Images\NewDocumentHS.png"/>
...
<Button Command="ApplicationCommands.New" Padding="2,2,2,1">
<Image Source="{StaticResource TB_NewIcon}" Height="16" Width="16" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
</Button>
Для тега кнопки атрибут Padding необходим, чтобы гарантировать, что изображение не усечено на высоте 15 пикселей и что размер кнопки не будет изменен в соответствии с изображением. В качестве альтернативы мы могли бы указать Padding = "1", но тогда мы должны вручную установить Height = "21" и Width = "22", чтобы размер кнопки не изменялся в соответствии с размером изображения
На вкладке "Изображение" высота и Ширина необходимы, чтобы изображение не растягивалось. SnapsToDevicePixels и RenderOptions.BitMapScalingMode необходимы, чтобы гарантировать отсутствие размытия. Я не могу обещать, что это будет хорошо работать для всех разрешений.
Примечание. Для значка NewDocumentHS.png, вызывающего больше всего проблем, поскольку он занимает все 16 пикселей по высоте, вы можете настроить отступы на «1,1,3,2», чтобы нижняя часть более точно совпадает с другими значками.
Вы можете попробовать новое свойство, доступное сейчас в WPF4. Оставьте RenderOptions.BitmapScalingMode
на Высокое качество или просто не заявляйте об этом.
В корневом элементе (т. Е. В главном окне) добавьте это свойство: UseLayoutRounding="True"
.
Свойство, ранее доступное только в Silverlight, теперь устраняет все проблемы с размером растрового изображения. :)
Обратите внимание - некоторые эффекты округления макета могут иметь точный макет:
ширина и / или высота элементов может увеличиваться или уменьшаться не более чем на 1 пиксель
размещение объекта может перемещаться не более чем на 1 пиксель
центрированные элементы могут быть смещены по вертикали или горизонтали от центра не более чем на 1 пиксель
Дополнительную информацию можно найти здесь: http://blogs.msdn.com/text/archive/2009/08/27/layout-rounding.aspx