Отображение данных из буфера обмена

203
26 марта 2018, 22:17

Необходимо написать программу для отображения данных из буфера обмена (для проверки сохранения объектов).

В буфер сохраняются данных в несколько потоков (text, unicode, html, rtf, bitmap, "свой бинарный формат", и так далее).

Данные вытащить из буфера не проблема, но столкнулся с эстетической проблемой отображения информации в tabcontrol. Для каждого потока формируется своя закладка со своим наполнением в зависимости от типа отображаемых данных. Например для потока text или unicode отображается просто richtextbox, для rft - два richtextbox с отображением в виде текста и в виде отрендеренного rtf. Для картинки соответственно image с картинкой и textbox с байтами в "hex"-формате.

Полистав немного интернет, нашел одно решение, использовать itemtemplateselector, но некоторые говорят, это не очень хорошая идея использовать его для большого выбора (в моем случае я не знаю на сколько это будет большой выбор, но десяток форматов будет).

Хотелось бы добавить гибкости, для простого добавления отображения новых форматов.

Стоит ли продолжать используя itemtemplateselector или для моего решения лучше использовать какой-то иной подход?

Answer 1

Стандартная альтернатива — использование DataTemplate по умолчанию. Для этого определим словари, которые будут показывать, как отображается заголовок и контент каждого типа, и поместим их в ResourceDictionary. Пускай у нас есть два типа: string и RtfString

class RtfString
{
    public string Content { get; set; }
}

и наш DataContext выглядит так:

new object[]
{
    "I'm string",
    new RtfString() { Content = "I'm RTF" },
    "I'm another string"
}

Тофда определения для отображаемых типов такие:

FormatNames.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:local="clr-namespace:Test">
    <DataTemplate DataType="{x:Type sys:String}">
        <TextBlock Text="string"/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:RtfString}">
        <TextBlock Text="RTF"/>
    </DataTemplate>
</ResourceDictionary>

Formats.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:local="clr-namespace:Test">
    <DataTemplate DataType="{x:Type sys:String}">
        <TextBlock Text="{Binding ., StringFormat='String: {0}'}"/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:RtfString}">
        <TextBlock Text="{Binding Content, StringFormat='Rtf: {0}'}"/>
    </DataTemplate>
</ResourceDictionary>

Ну и TabControl:

<TabControl ItemsSource="{Binding}">
    <TabControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Formats.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="TabItem">
                <Style.Resources>
                    <ResourceDictionary Source="FormatNames.xaml"/>
                </Style.Resources>
            </Style>
        </ResourceDictionary>
    </TabControl.Resources>
</TabControl>

Результат:

Для добавления новых типов контента нужно положить новый DataTemplate для данного типа в каждый из словарей.

READ ALSO
Google analytics дублирование

Google analytics дублирование

Проблема при отслеживании электронной торговли в google analytics, данные передаются через measurment protocolФормат запросов следующий: передача транзакции...

191
Не работает цикл в отдельном потоке WPF

Не работает цикл в отдельном потоке WPF

Программа запускается, но не выводит интерфейс

170
&ldquo;Дыра&rdquo; в окне без границы

“Дыра” в окне без границы

Пытаюсь создать метод, который будет рисовать окно с неким уведомлениемУведомление представляет собой форму без границы, на которой размещается...

217
WPF. Отсчитать время в Async методе

WPF. Отсчитать время в Async методе

Есть WPF приложение, в котором запускается async методВ методе есть бесконечный цикл, который что-то делает

185