Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > WPF, UWP, WinRT, XAML
Регистрация

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

Ответ
 
Опции темы
Старый 29.10.2010, 02:33   #1
Casper-SC
Участник клуба
 
Регистрация: 04.07.2007
Адрес: Россия
Сообщений: 549
Репутация: 134

icq: 438116304
По умолчанию Создаю свой 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
Репутация: 53
По умолчанию

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

Код:

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
Репутация: 134

icq: 438116304
По умолчанию

Вот немного переделал, так как прошлый способ получал в список не отдельные 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
Репутация: 53
По умолчанию

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

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

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

icq: 438116304
По умолчанию

Ясно.

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

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

Код:

{Binding ElementName=lslFontsFamily, Path=SelectedValue.Content}

__________________
#include <мозг.h>
Руслантус вне форума   Ответить с цитированием
Старый 29.10.2010, 12:56   #7
Casper-SC
Участник клуба
 
Регистрация: 04.07.2007
Адрес: Россия
Сообщений: 549
Репутация: 134

icq: 438116304
По умолчанию

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

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

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

icq: 438116304
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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 01:24
Получение списка файлов Костян Пират Общие вопросы Delphi 11 16.02.2009 10:58
получение 1 списка из 2-х Neznau Помощь студентам 0 10.12.2008 23:16


16:32.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru