Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2010, 02:33   #1
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию Создаю свой FontDialog для WPF. Получение списка шрифтов системы...

Привет всем! Вот понадобилось мне сделать окно для настроек шрифта. Чтобы пользователь мог настроить шрифт. Пока я только начал это дело и вроде бы могу получить список шрифтов. Но не понятно как мне при выборе шрифта в ListBox'e сделать так, чтобы этот шрифт применялся к TextBlock (он отображает текст для предпросмотра). Я догадываюсь, что можно, что-то придумать с биндингами и т.д. Вообще подскажите кто знает, как сделать. То есть вообще нужно, чтобы я не просто в листбоксе выделял айтем, а чтобы выбранный в списке шрифт применялся к текстблоку или переменной какой, не важно.

Вот XAML:
Код:
<Window x:Class="MyProgram.WindowConfigureFont"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Настройте шрифт" Height="435" Width="506"
        TextOptions.TextFormattingMode="Display"
        TextOptions.TextRenderingMode="ClearType">
    <Grid>
        <Label Content="Начертание" Height="31" HorizontalAlignment="Left" Margin="186,78,0,0" Name="label3" VerticalAlignment="Top" Width="124" />
        <Label Content="Размер:" Height="31" HorizontalAlignment="Left" Margin="316,78,0,0" Name="label2" VerticalAlignment="Top" Width="64" />
        <Label Content="Шрифт:" Height="31" HorizontalAlignment="Left" Margin="12,78,0,0" Name="label1" VerticalAlignment="Top" Width="170" />
        <TextBox Height="23" Margin="12,99,0,0" Name="textBoxFontName" VerticalAlignment="Top" HorizontalAlignment="Left" Width="170" />
        <ListBox Margin="12,128,0,0" Name="listBoxFontNameList" Height="167" VerticalAlignment="Top" HorizontalAlignment="Left" Width="170" />
        <TextBox Height="23" Margin="188,99,0,0" Name="textBoxTracing" VerticalAlignment="Top" HorizontalAlignment="Left" Width="122" />
        <TextBox Height="23" Margin="316,99,0,0" Name="textBoxFontSize" VerticalAlignment="Top" HorizontalAlignment="Left" Width="73" />
        <ListBox Margin="188,128,0,0" Name="listBoxFontTracing" Height="167" VerticalAlignment="Top" HorizontalAlignment="Left" Width="122" />
        <ListBox Margin="316,128,0,0" Name="listBoxFontSize" Height="167" VerticalAlignment="Top" HorizontalAlignment="Left" Width="73">
            <ListBoxItem Content="8" />
            <ListBoxItem Content="9" />
            <ListBoxItem Content="10" />
            <ListBoxItem Content="11" />
            <ListBoxItem Content="12" />
            <ListBoxItem Content="14" />
            <ListBoxItem Content="16" />
            <ListBoxItem Content="18" />
            <ListBoxItem Content="20" />
            <ListBoxItem Content="22" />
            <ListBoxItem Content="24" />
            <ListBoxItem Content="26" />
            <ListBoxItem Content="28" />
            <ListBoxItem Content="36" />
            <ListBoxItem Content="48" />
            <ListBoxItem Content="72" />
        </ListBox>
        <GroupBox Header="Видоизменение" Height="82" HorizontalAlignment="Left" Margin="12,301,0,0" Name="groupBox1" VerticalAlignment="Top" Width="377">
            <Grid></Grid>
        </GroupBox>
        <GroupBox Header="Образец" Height="81" HorizontalAlignment="Left" Margin="12,0,0,0" Name="groupBox2" VerticalAlignment="Top" Width="377">
            <Grid>
                <TextBlock Margin="6" Name="textBlockTestFont" Text="Тест шрифта My Program " TextAlignment="Center" FontStretch="Normal" FontWeight="Normal" FontStyle="Normal" />
            </Grid>
        </GroupBox>
    </Grid>
</Window>
Вот код:
Код:
    public partial class WindowConfigureFont : Window
    {
        public WindowConfigureFont()
        {
            InitializeComponent();
            //создаём список для шрифтов
            List<FontFamily> listFontFamiliyes = new List<System.Windows.Media.FontFamily>(); 
            //заполняем список шрифтами
            listFontFamiliyes.AddRange(Fonts.GetFontFamilies(Environment.GetFolderPath(Environment.SpecialFolder.Fonts))); 

            //создаём список для хранения названий шрифта
            List<String> listFontNames = new List<String>();
            foreach (FontFamily fontFamily in listFontFamiliyes)
            {
                List<String> str = new List<String>();
                str.AddRange(fontFamily.FamilyNames.Values);
                foreach (String strF in str)
                {
                    listFontNames.Add(strF);
                }
            }
            this.listBoxFontNameList.ItemsSource = listFontNames;
        }
    }
Casper-SC вне форума Ответить с цитированием
Старый 29.10.2010, 09:11   #2
Руслантус
Наркоман самоучка
Форумчанин
 
Аватар для Руслантус
 
Регистрация: 22.07.2007
Сообщений: 276
По умолчанию

Пример декларативным способом:

Код:
xmlns:s="clr-namespace:System;assembly=mscorlib"
***
<ListBox Name="lstFontsFamily">
            <ListBox.ItemsSource>
                <x:Array Type="s:String">
                    <s:String>Arial</s:String>
                    <s:String>Tahoma</s:String>
                    <s:String>Times New Roman</s:String>
                </x:Array>
            </ListBox.ItemsSource>
</ListBox>
<TextBlock FontFamily="{Binding ElementName=lstFontsFamily, Path=SelectedValue}">Hello World!</TextBlock>
#include <мозг.h>
Руслантус вне форума Ответить с цитированием
Старый 29.10.2010, 11:46   #3
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Вот немного переделал, так как прошлый способ получал в список не отдельные FontFamily, а все FontFamily включая значения каждого элемента коллекции Values у FontFamily. Получалось, что в списке присутствовали лишние элементы, которые не меняли шрифт, но сами были написаны иероглифами. Теперь каждый элемент списка отображается своим шрифтом. Перестали значения биндиться. То есть текстблок не реагирует. Интересно почему? Ведь вроде особо ничего не поменялось?

В общем я понял как всё сделать не декларативно. Но всё же интересно почему не биндится больше?

Код:
        public WindowConfigureFont()
        {
            InitializeComponent();
            //создаём список для шрифтов
            List<FontFamily> listFontFamilies = new List<System.Windows.Media.FontFamily>();
            //заполняем список шрифтами
            listFontFamilies.AddRange(Fonts.GetFontFamilies(Environment.GetFolderPath(Environment.SpecialFolder.Fonts)));

            //создаём список для хранения названий шрифта
            List<String> listFontNames = new List<String>();
            //список айтемов для листбокса
            List<ListBoxItem> listItems = new List<ListBoxItem>();

            foreach (FontFamily fontFamily in listFontFamilies)
            {
                List<String> str = new List<String>();
                str.AddRange(fontFamily.FamilyNames.Values);

                ListBoxItem listBoxItem = new ListBoxItem();
                listBoxItem.FontFamily = fontFamily;
                listBoxItem.Content = str[0];
                listItems.Add(listBoxItem);
            }

            this.listBoxFontNameList.ItemsSource = listItems;
        }

Последний раз редактировалось Casper-SC; 29.10.2010 в 11:50.
Casper-SC вне форума Ответить с цитированием
Старый 29.10.2010, 12:08   #4
Руслантус
Наркоман самоучка
Форумчанин
 
Аватар для Руслантус
 
Регистрация: 22.07.2007
Сообщений: 276
По умолчанию

Потому-что ты теперь свойству FontFamily присваиваешь не string, а ListBoxItem.

То есть, у ListBoxItem вызывается метод ToString, который возвращает не то, что нужно.
#include <мозг.h>

Последний раз редактировалось Руслантус; 29.10.2010 в 12:19. Причина: Дополнение.
Руслантус вне форума Ответить с цитированием
Старый 29.10.2010, 12:24   #5
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Ясно.

И теперь уже нельзя в XAML забиндить? Ну то есть теперь как-то в том конструкторе мне придётся делать (хотя можно руками сделать по событиям листбокса, но всё же)? Я пробовал, что-то не нашёл как забиндить из XAML.
Casper-SC вне форума Ответить с цитированием
Старый 29.10.2010, 12:45   #6
Руслантус
Наркоман самоучка
Форумчанин
 
Аватар для Руслантус
 
Регистрация: 22.07.2007
Сообщений: 276
По умолчанию

Нужно изменить путь:

Код:
{Binding ElementName=lslFontsFamily, Path=SelectedValue.Content}
#include <мозг.h>
Руслантус вне форума Ответить с цитированием
Старый 29.10.2010, 12:56   #7
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

О, спасибо! Я бы в жизни не догадался. Нет, ну почему у студии в XAML IntelleSense так плохо работает... Ни подсказок толком, ничего. Вот это пожалуй большой минус студии при работе с WPF в отличии от WinForms где в разы всё удобнее сделано. И подсказок море.

Последний раз редактировалось Casper-SC; 29.10.2010 в 13:06.
Casper-SC вне форума Ответить с цитированием
Старый 29.10.2010, 13:06   #8
Руслантус
Наркоман самоучка
Форумчанин
 
Аватар для Руслантус
 
Регистрация: 22.07.2007
Сообщений: 276
По умолчанию

Пользуйся Visual Studio 2010. Там уже появился IntelliSense для биндингов, возможность привязки с помощью удобной формы и много другого.
#include <мозг.h>
Руслантус вне форума Ответить с цитированием
Старый 29.10.2010, 13:53   #9
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Цитата:
Сообщение от Руслантус Посмотреть сообщение
Пользуйся Visual Studio 2010. Там уже появился IntelliSense для биндингов, возможность привязки с помощью удобной формы и много другого.
Просто, как сделать из студии возможность привязки к Content я например не нашёл. Только если руками прописать.

Так у меня и есть Visual Studio 2010. Может заметил в XAML я использую TextOptions доступный только из 4-ой версии фрэймворка.

Последний раз редактировалось Casper-SC; 29.10.2010 в 19:01.
Casper-SC вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WPF Получение 2D координат 3D вектора Eugene123 WPF, UWP, WinRT, XAML 0 09.10.2010 20:15
Получение списка процеcсов legendary Win Api 12 02.09.2010 18:06
Получение списка файлов кроссплатформа kin63camapa Общие вопросы C/C++ 2 13.02.2010 00:24
Получение списка файлов Костян Пират Общие вопросы Delphi 11 16.02.2009 09:58
получение 1 списка из 2-х Neznau Помощь студентам 0 10.12.2008 22:16