powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Изменить предка ресурсов
12 сообщений из 12, страница 1 из 1
Изменить предка ресурсов
    #39625806
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, можно ли привязаться к ресурсу DockPanel, и извлечь цвет фона для TextBlock
Получилось сделать через прокси-элемент, но решение некрасивое.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    <DockPanel>
        <DockPanel.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Background"
                        Value="Red"></Setter>
            </Style>
        </DockPanel.Resources>

        <TextBlock Name="TextBlockProxy"
                   Visibility="Collapsed"
                   DockPanel.Dock="Top"
                   Text="Sample text"></TextBlock>

        <ListBox DockPanel.Dock="Top"
                 ItemsSource="{Binding ElementList}">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="{x:Type system:String}">
                    <Grid>
                        <TextBlock Text="{Binding }"
                                   Background="{Binding ElementName=TextBlockProxy, Path= Background}"></TextBlock>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <Canvas />
    </DockPanel>
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39625843
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,
У меня телерик либы. Однако я стиль вынужден выбирать и тыкать отдельно. Сначала для формы, потом докПанели, потом гриду на них.
Т.е. не знаю почему, но нет наследования.
Может и у вас так?
Т.е. отдельный компонент или стиль и все потом на него ссылаются.
Без вытаскивания.
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39625848
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объявить у ресурса x:Key, и обращаться через StaticResource/DynamicResource.
В принципе, через RelativeSource можно выйти на DockPanel, но из её ресурсов не получится вытащить стиль исключетельно посредством XAML, т.к. в вышеприведенном виде ключом ресурса является тип элемента, для которого задан стиль. Т.е. тут нужно прикручивать конвертер:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class ResourceConverter : IMultiValueConverter
{
  public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
  {
    if (values.Length < 2) return DependencyProperty.UnsetValue;
    if (!(values[0] is FrameworkElement resOwner) || (values[1]==null)) return DependencyProperty.UnsetValue;
    var style = resOwner.TryFindResource(values[1].GetType()) as Style;
    if (style==null) return DependencyProperty.UnsetValue;
    foreach(var setter in style.Setters.OfType<Setter>())
      if (setter.Property.PropertyType == targetType)
        return setter.Value;
    return DependencyProperty.UnsetValue;
  }

  public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  {
    throw new NotImplementedException();
  }
}


и в разметке писать
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<ListBox DockPanel.Dock="Top" ItemsSource="{Binding ElementList}">
  <ListBox.ItemTemplate>
    <DataTemplate DataType="{x:Type system:String}">
      <Grid>
        <TextBlock Text="{Binding }">
          <TextBlock.Background>
            <MultiBinding Converter="{StaticResource ResourceConverter}">
              <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DockPanel}}" />
              <Binding RelativeSource="{RelativeSource Self}" />
            </MultiBinding>
          </TextBlock.Background>
        </TextBlock>
      </Grid>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>


можно, конечно, сделать свой binding extension для такого случая, но от вышеприведенной работы по извлечению ресурса это не избавит, просто она будет за кадром. Я бы не прибегал к таким извращениям, и просто бы использовал именованные ресурсы.
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39625933
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нафига это делать? чтоб они были одного цвета? сделайте элемент прозрачным.
но лучший вариант. как уже написали, создать ресурс и использовать его и в dockpanel и шаблоне элемента
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39625987
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesнафига это делать? чтоб они были одного цвета? сделайте элемент прозрачным.
но лучший вариант. как уже написали, создать ресурс и использовать его и в dockpanel и шаблоне элементаНе могу и не хочу выделять ресурс. Это же просто тестовый пример. Нет этого ресурса в явном виде.

Сон Веры Павловны,
Спасибо.
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39626401
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

не могу, не хочу...
написать в ресурсном файле или в ресурсах любого элемента управления
<SolidColorBrush x:Key="MyKey" Color="Red"/>
и написать Background="{DynamicResource MyBrush}" это не могу и не хочу? это же легко и супер удобно.
Локализация с ресурсами происходит так же прозрачно и удобно. Если ресурс динамический (ссылка на ресурс), достаточно просто переключать ресурсные файлы и язык будет меняться без перезагрузки, вместе с картинками и чем угодно. Скины, вы просто загружается XAML Файл с ресурсами скиннов и полностью меняете палитру приложения. Просто одинаковые файлы с одинаковыми именами ресурсов но разными настройками представления.
Если есть сложности и NameScope'ом при связывании, можно использовать относительное связывание относительно визуального дерева через RelaticeSource и режимаFindAncestor , можно указать, как именно элемент выше по визуальному дереву заданного типа. Получается огромная партянка, уже давно все жалуются на такой многословный синтаксис такого биндинга. Он еще чреват тем, что шаблон может измениться и будет не то, что задумывали.
В качестве источник для Binding'а можно указать ресурс, но только статический, то есть ссылка будет получена 1 раз, если программно менять ресурс, он не обновится при связывании.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="{x:Type Border}">
            <Setter Property="BorderBrush" Value="Black"/>
            <Setter Property="BorderThickness" Value="3"/>
        </Style>
        <SolidColorBrush x:Key="MyBrush" Color="Red" />
    </Window.Resources>
    <Grid Background="White">
        <Border Margin="30" Background="{DynamicResource MyBrush}">
            <Border Margin="30" Background="{DynamicResource MyBrush}">
                <Border.Resources>
                    <SolidColorBrush Color="Green" x:Key="MyBrush"/>
                </Border.Resources>
                <Border Margin="30" Background="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}">
                    <Border Margin="30" Background="{Binding Source={StaticResource MyBrush}}">

                    </Border>
                </Border>
            </Border>
        </Border>
    </Grid>
</Window>

...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39626403
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Ну зачем решать тестовую задачу? Я не знаю какой будет цвет
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39626408
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Есть панель. Там набросаны элементы. Все в одном стиле.
Надо вывести однотипную информацию, которая может состоять из нескольких строк (заранее неизвестно).
Выбран ListBox, установлен в реадонли. Привязан сорс.
И все TextBlock оказались в другом стиле.
А хотелось бы в том же.

Реши эту задачу. Может не ListBox надо взять, тогда что?
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39626413
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregЯ не знаю какой будет цветво время разработки или выполнения?
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39626414
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Менять TextBlock как по мне вообще идея неудачная, лучше менять подложку, для изменения цвета.
Еще есть 1 момент, TextBlock может состоять из текстовых элементов FlowDocument, Run'ов и прочих.
Код: c#
1.
2.
3.
4.
5.
6.
7.
<TextBlock>
    <TextBlock.Inlines>
        <Run Text="{Binding Property1}"/>
        <LineBreak/>
        <Run Text="{Binding Property2}"/>
    </TextBlock.Inlines>
</TextBlock>


Это так же хорошо экономит количество элементов в визуальном дереве, там где можно обойтись 1 TextBlock'ом, вместо 5и.
Я не понял, в чем у вас проблема. Что конкретно нужно решать?
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39626420
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesЯ не понял, в чем у вас проблема. Что конкретно нужно решать?
У меня вообще нет проблем. Просто поинтересовался можно "изменить предка ресурсов?"
Догадывался, что нельзя, но на всякий случай спросил...
...
Рейтинг: 0 / 0
Изменить предка ресурсов
    #39626433
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

Нужно просто переопределить ресурс еще раз, вообще сам переопределение будет работать и со статическими ресурсами. Динамические ресурсы тут не главное.
Когда все ресурсы в XAML файлах, такой проблемы нет.
Ресурсы как правило расположены на определенных уровнях иерархии дерева, а не размазаны по коду. Если размазаны, это плохо, тяжело будет их искать, ползать по дереву тот еще геморой.
Файл может загружаться и выгружаться в ресурсы такого корневого элемента (окна, программы, элемента управления, шаблона данных).
Локализация обычно на уровне app.xaml.
Окно по сути состоит из файлов: XAML файлов со стилями, XAML файла с ресурсами, разметкой окна.
В окне или шаблоне окна они мержатся и попадают в визуальное дерево.
для примера пилить файлы это перебор конечно, но в реальных условиях я бы делал только так.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Изменить предка ресурсов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]