2009-10-20 3 views
3

У меня есть Canvas в ResourceDictionary файле XAML следующим образом:Настройка Canvas на шаблон управления?

<Canvas x:Key="Icon"> 
    <Path ... /> 
    <Path ... /> 
</Canvas> 

В моем коде-за загружаю эту иконку с помощью

LayoutGrid.Children.Add(FindResource("Icon") as Canvas); 

И это работает отлично. Теперь я хочу создать кнопку, которая использует тот же значок, что и шаблон. Поэтому я создаю шаблон управления:

<ControlTemplate x:Key="IconTemplate"> 
    ... 
</ControlTemplate> 

Теперь вот проблема: Как бы я поставил «значок» ресурс холст в шаблон управления? Насколько я знаю, Canvas не имеет свойства Style или Template. У него есть свойство «Дети», но он недоступен через XAML. Как я могу использовать свой холст в шаблоне?

+0

Я обновил свой ответ с дополнительной информацией для вы. –

ответ

8

Когда вы создаете такой тип, как холст, как ресурс, вы создаете экземпляр типа ONE. Это означает, что вы не можете разместить этот ресурс в нескольких местах вашего приложения (элемент может находиться только в одном месте за раз). Думаю, вы должны взглянуть на использование шаблонов управления.

Для этого вам не нужен код.

Что-то вроде этого:

<ControlTemplate x:Key="Icon"> 
    <Canvas> 
    <Path ... /> 
    <Path ... /> 
    </Canvas> 
</ControlTemplate> 

Тогда в другом месте вы делаете что-то вроде этого:

<Button> 
    <Control Template="{StaticResource Icon}" /> 
</Button> 

Это строит регулярный ищет кнопку с иконкой, как это содержание. Содержимое этой кнопки - это ваш значок.

Если, однако, вы хотите, чтобы полностью изменить шаблон вашей кнопки, то вы могли бы сделать так

<ControlTemplate x:Key="Icon" TargetType="Button"> 
    <Canvas> 
    <Path ... /> 
    <Path ... /> 
    </Canvas> 
</ControlTemplate> 

Тогда в другом месте вы делаете что-то вроде этого:

<Button Template="{StaticResource Icon}" /> 

Заметьте, что это ISN отличный стиль для кнопки. Посмотрите на this example from Microsoft на пример более полнофункционального шаблона кнопок.

EDIT

Если у вас есть в вашем ControlTemplate в ContentPresenter, то нет никакой необходимости, чтобы назначить шаблон для управления содержимым. Обратите внимание, что любой класс, полученный из Control, может быть шаблоном, включая Control. Поэтому для того, чтобы поместить элемент в вашей точки зрения, то вы можете просто использовать:

<Control Template="{StaticResource Icon}" /> 

Это использует широкий применимый тип в иерархии, который также является самым легким.

+0

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

+0

Хм ... Я все еще не на 100% понимаю, что вы пытаетесь сделать. Если вы разместили XAML, который воспроизводит ошибку, которую вы видите, это было бы полезно. –

+0

Я понял. Я просто пошел с вашим предложением, и я превратил все в контрольный шаблон. Затем на моих холстах я просто добавил значок , чтобы показать значок в виде холста, и

0

Хороший способ сделать определить значок для кнопки, чтобы использовать DrawingBrush и установить его в качестве заливку прямоугольника что вы встраивать в Баттона:

<Button> 
    <Rectangle 
     Width="32" 
     Height="32" 
     Fill={Background myDrawingBrush} 
    /> 
</Button> 

myDrawingBrush должен быть определен в следующих ресурсах:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"> 
    <DrawingBrush x:Key="dialogerror" Stretch="Uniform"> 
     <DrawingBrush.Drawing> 
      <DrawingGroup> 
       <GeometryDrawing> 
        ... define geometry here ... 
       </GeometryDrawing> 
     </DrawingBrush.Drawing> 
    </DrawingBrush> 
</ResourceDictionary>