Wpf не удалось разрешить ресурс converter
Стиль Windows из ResourceDictionary не применяется (2)
Добавить новую кисть в словарь ресурсов
и в вашем окне WPF просто установите требуемый ресурс в свойство фона окна
Поскольку у меня несколько Window в моем приложении, я ищу решение, которое не требует от меня binding для каждого Window .
Я создал ResourceDictionary который имеет style для Window Background:
В моем XAML я установил ResourceDictionary :
Нет ошибки, но мой цвет Window остается белым.
Это, по-видимому, вызвано комбинацией порядка, в котором WPF загружает / обрабатывает стили из вложенного ResourceDictionary и особенности класса Window .
Предположим, что MainWindow определяется как ваш пост. Теперь добавьте следующее в Templates.xaml :
Если MainWindow не имеет определенного стиля, вы увидите, что в дизайнере он появляется с красным фоном. Дизайнер разбирает весь Xaml и загружает словарь ресурсов, а затем рисует результаты. Стиль читается до того, как окно будет нарисовано, и, таким образом, будет применен красный фон.
При запуске приложения окно создается до применения ResourceDictionary . Он ищет стиль по умолчанию (стиль с x:Key="" ) перед обработкой вложенного ResourceDictionary и ничего не находит. Поэтому во время выполнения появляется окно с цветом по умолчанию. (Это поведение описано в комментариях выше.) Помните, что стиль с x:Key="" имеет значение по умолчанию, соответствующее стилю Windows.
Это подтверждается, если вы явно используете myStyle . Если вы добавите в свое определение Window атрибут Style="" вы обнаружите, что конструктор вышел из строя, но вы также получите ошибку во время выполнения, поскольку myStyle не был создан в то время, когда требуется окно Это. Если вы переключитесь на Style="" вы увидите, что он работает так, как вы надеетесь, потому что DynamicResource будет обновляться после того, как будет проанализирован ResourceDictionary и включен стиль.
Итак, применив это, вы можете устранить проблему одним способом, добавив это в свой элемент Window: Style=">" - но это неуклюже. Лучшее решение состоит в том, чтобы включить словарь ресурсов в файл app.xaml , где он будет разбираться до открытия любого окна и, таким образом, для всех:
Реальная проблема здесь в том, что ваше Window самом деле не является Window : это класс, который происходит из Window и на самом деле будет MainWindow , Window2 и т. Д. Это означает, что автоматический набор настроек для Window никогда не будет работать в этом и, к сожалению, всегда будет требоваться некоторый уровень ручной привязки.
Установить свойство 'System.Windows.Data.Binding.Converter' выбросил исключение.
Значение, которое получает привязку, имеет тип Uri . Есть внутренний InvalidCastException , который говорит:
Невозможно привести объект типа 'System.String' к типу 'System.Windows.Data.IValueConverter'.
Вот мой конвертер:
И вот XAML, который бросает исключение:
3 ответа
Каков рекомендуемый способ запуска фонового потока при запуске приложения wpf/mvvm? То есть я хотел бы запустить поток сразу после инициализации UI. В идеале я хотел бы использовать команду xaml/для достижения этой цели. Спасибо.
Попробуйте ссылаться на свой конвертер как на StaticResource
забыл упомянуть привязку расширения Markup с атрибутом ElementName, может быть?
Похожие вопросы:
У меня есть стандартная коробка wpf datepicker, где привязан SelectedDate: <DatePicker x:Name=EffDatePicker SelectedDate=/> Когда страница.
Когда мое приложение впервые запускается и загружается представление приложения, я пытаюсь привязаться к логическим атрибутам, чтобы условно установить класс CSS. Логические атрибуты.
я хочу установить значение, когда приложение launching.i.e. в моем приложении я должен select имя местоположения при запуске приложения. Моя проблема заключается в том, что при запуске приложения.
Каков рекомендуемый способ запуска фонового потока при запуске приложения wpf/mvvm? То есть я хотел бы запустить поток сразу после инициализации UI. В идеале я хотел бы использовать команду xaml/для.
У меня есть приложение WPF, которое будет работать в автономном режиме с локальными данными. При запуске приложения мне нужно, чтобы пользователь повторно ввел свои учетные данные Windows, чтобы.
У меня есть проблема с передачей объекта в конвертер в WPF. Мой DataGrid выглядит так: <DataGrid x:Name=customTasksDataGrid Margin=10,10,10,38 Grid.Column=1 IsReadOnly=True.
Я разработал приложение wpf и хочу, чтобы оно запускалось при каждом запуске компьютера. Однако я не смог этого сделать so. I попытался отредактировать реестр, как этот ответ. Стартовое окно.
Я начинаю новый проект WPF, и мне нужно освещение при запуске приложения. Я смотрел 2 разных проекта WPF, чтобы понять, с чего начать. Первый начинается с метода void App_Startup(object sender.
Мое приложение WPF показывает изображение PNG в качестве заставки при запуске, используя стандартный рекомендуемый метод MS . То есть я выбрал существующий файл изображения и установил его действие.
Однако, если я попытаюсь открыть любые другие окна с помощью метода Show или ShowDialog, я получаю исключение IOEx в методе InitializeComponent, говоря "Невозможно найти ресурс" Window1.xaml "(или любой другой файл, который вызывается). Это происходит с каждым отдельным окном, которое я создаю. Я искал в Интернете, но все решения, похоже, говорят" убедитесь, что атрибут StartupUri для App.xaml верен", а мой - это открытие MainWindow.
Любая идея, что происходит?
где ты пишешь код для открытия? предоставляют Window1 в Startupuri? код для открытия Window1 был в обработчике события нажатия кнопки в MainWindow. Поскольку я был в начале проекта, я решил удалить проект и начать заново. Скопируйте и вставьте код в новый проект, и он работает сейчас! компилятор, должно быть, запутался в чем-то. Я говорю, что это работает, фактически метод ShowDialog теперь открывает окно и немедленно закрывает его, возвращая false! забудь мою вторую проблему. был ли я идиотом! забыл, что я устанавливал свойство видимости скрытым. все работает сейчас. не знаю, что происходило в моей первоначальной проблеме, если кто-нибудь знает, было бы интересно узнать В моем случае я забыл написать правильное и полное название вида! Дурак я! Это должно быть похоже на StartupUri="Views/MainWindow.xaml" и я написал StartupUri="Views/MainWindow"Вышеуказанное не помогло мне, но что было сделано следующим образом. Откройте App.xaml
Затем вам необходимо изменить начальный URI на полностью квалифицированный. В моем случае я переместил свой MainWindow.xaml в папку под названием "Main", поэтому изменив указанный выше URI на
Решил мою проблему.
Я сделал то же самое, и это сработало после того, как я перезапустил проект и перестроил его.У меня была эта проблема, когда "AssemblyName" и "Default Namespace" в настройках проекта имели одинаковое значение. Изменение AssemblyName на что-то другое решило проблему.
Это также помогло мне. Хотя я клянусь, у меня есть точная копия проекта (приложение Beyond Compare, по сути, показывает только изменения пространства имен, и работает нормально). Фактически, если я выбрал другое имя, но использовал его как «Имя сборки», так и «Пространство имен по умолчанию», оно также работает. Кажется, что проблема в действительности заключается в конкретном имени сборки, в то время как пространство имен по умолчанию не имеет значения. Я могу только догадываться, что это может быть связано с другим проектом, который у меня есть в моем решении. По какой-то странной причине это сработало и для меня.У меня была такая же проблема. Причина для меня, потому что я переместил MainWindow.xaml без настройки App.xaml. Если вы перемещаете MainWindow.xaml, например, в папку под названием "UI", вы должны настроить следующую строку в App.xaml
Если вы откроете код для файла Window1.xaml(т.е. Window1.xaml.cs), вы можете щелкнуть правой кнопкой мыши по вызову метода InitializeComponent и выбрать "Goto Definition". Будет следующий код:
Если Uri в приведенном выше коде неверен, вы получите эту ошибку.
Наконец, если что-то переименовывает файл XAML как часть вашего процесса сборки (например, обфускацию), то вы снова получите эту ошибку.
Кроме этого, я бы попробовал "Чистое решение" и "Восстановить решение", чтобы убедиться, что файл с инициализацией InitializeComponent перестроен.
Доброго времени суток! Делаю первые шаги в WPF и сразу столкнулся со следующей проблемой:
Написал стиль для кнопок моего приложения, который вместо обычного текста выводит вначале иконку, а за ним уже текстовый блок. Вот он:
<Setter Property="Content">
<Setter.Value>
<StackPanel Orientation="Horizontal">
<Image Width="16" Height="16" Stretch="Fill" Margin="3,0,3,0" Source=""/>
<TextBlock Text="" Margin="3,0,3,0"/>
</StackPanel>
</Setter.Value>
</Setter>
</Style>
А теперь, собственно, вопрос - как создать кнопку, использующую этот стиль, и задать ей значения Text и Image Source? тут вставлен на обум - подсмотрен в чьем-то примере. Или стили для этого не подходят и мне нужно создавать собственный класс кнопки, наследуясь от Button, добавлять в него новые свойства и встроенный стиль?
Помогите, гуру!
Заранее спасибо.
Так, уже осознал, что для этих целей используются не стили, а шаблоны (Templates). И для связи со свойствами контрола используется
Нарисовал такое вот чудовище:
<Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<ContentPresenter Width="16" Height="16" Content=""/>
<TextBlock Text="" Margin="3,0,3,0"/>
</StackPanel>
</Grid>
</ControlTemplate>
ContentPresenter, который нужен только для вывода передаваемого Image'а, биндинг по полю Tag. В общем, все страшно. Вопрос - как это облагородить? Как делать правильно и оптимально? либо все же создать свой собственный контрол, отличающийся от стандартной кнопки только наличем пары дополнителньых свойств? А Роман (Здебский) говорил, что это требуется только для смены поведенческой модели. =\
Никто не мешает наследоваться от класса Button, либо от ButtonBase, добавив необходимые зависимые свойства.
Если изображение зависит от контекста данных (DataContext) то, конечно, наследование не нужно.
ContentPresenter, который нужен только для вывода передаваемого Image'а, биндинг по полю Tag. В общем, все страшно. Вопрос - как это облагородить? Как делать правильно и оптимально?
Я бы создал свой класс кнопки (на основе ButtonBase), прикрутив к нему стиль, основанный на стандартном.
Понятно. Так и поступлю.
Хм, возникла проблема. Тут. конечно, наверняка мои руки, так как я еще слабо ориентируюсь в системе нэймспейсов WPF, но тем не менее.
Создал в Solution Explorer папочку Controls. Добавил новый класс - ImageButton. Унаследовал его от Button. В его XAML изменил теги <UserControl> на <Button>. Внешний вид пустого прямоугольника изменился.
<Button x:Class="XNARPGEditor.Controls.ImageButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
В ресурсном словаре, содержащем стили кнопок создаю DataTemplate для своего контрола, подключив соответствующее пространство имен:
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:XNARPGEditor.Controls">
.
<ControlTemplate x:Key="iconButtonTemplate" TargetType="">
Компиляция прохоидт на ура, но при запуске получаю следующую ошибку:
"Не удалось создать "Type" на основе текста "c:ImageButton".": номер строки "116" и позиция в строке "49".
Получаю наналогичную ошибку:
"Не удалось создать "TargetType" на основе текста "XNARPGEditor.Controls.ImageButton".": номер строки "116" и позиция в строке "49".
В чем проблема? Везде рассматриваются какие-то элементарные ситуации, когда вся эта пакость лежит в одном пространстве имен. >_>
Создал в Solution Explorer папочку Controls. Добавил новый класс - ImageButton. Унаследовал его от Button. В его XAML изменил теги <UserControl> на <Button>.
Вот это было зря. Нужно следующим образом:
1) Создаем класс, наслеованный от Button:
public class ImageButton : Button < >
>
2) Создаем ResourceDictionary-файл Themes\Generic.xaml, ставим ему тип Embedded Resource
В этом файле создаем стиль:
<ResourceDictionary xmlns:local="clr-namespace:MyControls">
<Style TargetType="local:ImageButton">
<!-- тут и будет стиль кнопки -->
</Style>
..
В принципе, можно подключить этот стиль обычным образом - через App.xaml.
Писал в браузере, надеюсь поможет.
"Не удалось создать "Type" на основе текста "local:ImageButton".": номер строки "116" и позиция в строке "49".
Ок. Вот шаги создания собственного контрола:
1) Создаем класс MyCustomButton
namespace MyWpfApplication.Controls
public class MyCustomButton : ButtonBase
>
>
2) Создаем стиль Style\MyCustomControl.xaml, ставим ему Build Action = Resource:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyWpfApplication.Controls;assembly=MyWpfApplication"> <!-- ВАЖНО: имя сборки указывать нужно! -->
<Style TargetType="">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="">
<Border Background="Red" BorderBrush="Bisque" BorderThickness="2">
<ContentPresenter Content="" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary> <Application x:Class="MyWpfAppliction.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles\MyCustomButtonStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application> <Window x:Class="MyWpfApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyWpfApplication.Controls"
Title="Window1" Height="300" Width="300">
<Grid>
<local:MyCustomButton Content="Text" />
</Grid>
</Window>
P.S. Я с WPF дела не имею, занимаясь лишь Silverlight-ом.
Ура! Спасибо огромное! Работает хреновина! ^_^
О! Получен ответ. Я попутно связался с Романом Здебским и задал тот же вопрос. Он предложил то же решение, но заодно познакомил с ведущим экспертом MVP по WPF - Александром Шером. И на наши размышлизмы он ответил так:
Сейчас попробую реализовать. Но в любом случае, hardcase, тебе еще раз огромное спасибо - на будущее буду знать, как делать собственные контролы! :)
WPF - Александром Шером. И на наши размышлизмы он ответил так
Да, про аттачнутые свойства я-то и забыл. Они в исходной задаче в самый раз подходят. :)
"XNARPGEditor.AttachedProperties.Button" выдал исключение.
Аха! Нашел более полную информацию:
Даааааааааааааа. Работает хреновина! ^_^ Ура! Щаз такого наворочу.
namespace XNARPGEditor.AttachedProperties
public static class Button
public static readonly DependencyProperty IconProperty =
DependencyProperty.RegisterAttached(
"Icon",
typeof(Image),
typeof(FrameworkElement),
new PropertyMetadata(null)); // вот здесь я забывал выставить значение по-умолчанию
[AttachedPropertyBrowsableForType(typeof(Control))]
public static Image GetIcon(FrameworkElement ctl)
return (Image)ctl.GetValue(IconProperty);
>
public static void SetIcon(FrameworkElement ctl, Image value)
ctl.SetValue(IconProperty, value);
>
>
>
Заинтриговал! Надо будет обязательно попробовать! :)
Казалось бы, проблема решена. ан нет. Все было здорово, пока на кнопочки я любовался в редакторе. При попытке же запустить откомпилированный проект, я получаю исключение о том, что DependencyProperty не получилось создать на основе текста ap:Button.Icon. (При этом в редакторе, все отображается и нормально работает).
Вот немного видоизменившийся класс, описывающий свойство расширения:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace AttachedProperties
public class Button
public static readonly DependencyProperty IconProperty =
DependencyProperty.RegisterAttached(
"Icon",
typeof(BitmapImage),
typeof(FrameworkElement),
new PropertyMetadata(null));
[AttachedPropertyBrowsableForType(typeof(Control))]
public static BitmapImage GetIcon(FrameworkElement ctl)
return (BitmapImage)ctl.GetValue(IconProperty);
>
public static void SetIcon(FrameworkElement ctl, BitmapImage value)
ctl.SetValue(IconProperty, value);
>
>
>
Окошко, в котором разворачивается действо:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:res="clr-namespace:XNARPGEditor.Properties"
xmlns:local="clr-namespace:XNARPGEditor"
xmlns:ap="clr-namespace:AttachedProperties;assembly=XNARPGEditor"
Title="Characteristics" Height="304" Width="800" Loaded="Window_Loaded">
<Grid>
<Button Style="" ap:Button.Icon="" Height="23" Margin="5" Name="acceptButton" Grid.Column="0" Click="acceptButton_Click" Content=""/>
</Grid>
</Window> <BitmapImage x:Key="iconOkGreen" x:Shared="false" DecodePixelHeight="16" DecodePixelWidth="16" UriSource="Images/Interface/OkGreen.ico"/>
И, как я уже говорил, и в студии, и в блендере все корректно отображается, компилируется без проблем. Но при запуске - ошибка.
Что интересно:
если я в Window (в стилях работает нормально), укажу сборку, то, при попытке комплияции, получу ошибку:
Я так понимаю, проблема именно в этом. но никак не могу разобраться - почему.
Собственно, само исключение:
System.Windows.Markup.XamlParseException не обработано
Message=Не удалось создать "DependencyProperty" на основе текста "ap:Button.Icon".
Source=PresentationFramework
LineNumber=0
LinePosition=0
StackTrace:
в System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
в System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)
в System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
в System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
в System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
в System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
в System.Windows.FrameworkElement.ApplyTemplate()
в System.Windows.FrameworkElement.MeasureCore(Size availableSize)
. только сейчас заметил затерявшуюся в дебрях строчку:
Но я не понимаю - к чему это! Где он нашел эти несчастные строки?!
Ах да, если в стилях закомментировать вывод изображения - все работает на ура! Вот тело шаблона:
Читайте также: