Начинающий - запутался в связывании и ресурсах в WPF

Вы можете изменить и попробовать:

Option Explicit

Sub test()

    Dim LastRow As Long, LastColumn As Long, Row As Long, Times As Long, Column As Long
    Dim str As String
    Dim rng As Range

    With ThisWorkbook.Worksheets("Sheet1")

        'Find last row column A
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        'Find last column row 1 (with titles)
        LastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column
        'Loop rows
        For Row = 2 To LastRow
            'Loop columns
            For Column = 2 To LastColumn
                'Loop values
                str = .Cells(Row, Column).Value
                'Set range for each row
                Set rng = .Range(Cells(Row, 2), Cells(Row, LastColumn))
                'How many times value appears in row
                Times = Application.WorksheetFunction.CountIf(rng, str)
                'if appears more than one times
                If Times > 1 Then
                    .Range(Cells(Row, 2), Cells(Row, LastColumn)).Interior.Color = vbGreen
                End If

            Next Column

        Next Row

    End With

End Sub
28
задан OrWhen 28 August 2010 в 18:49
поделиться

2 ответа

Во-первых, общий комментарий:

WPF трудно выучить. Трудно учиться, потому что есть несколько различных принципиально новых концепций, которые вы должны обдумать одновременно. Борьба, которую вы испытываете сейчас, заключается в том, что вы пытаетесь изучить как минимум три разные вещи одновременно:

  • Как XamlReader (и особенно расширения разметки) десериализует XAML в объекты. [тысяча сто тридцать два]
  • Как работают ресурсные словари FrameworkElement.
  • Как работает привязка данных.

Примерно так:

<TextBox Text="{Binding Source={StaticResource MyPerson}, Path=Name}"/>

задействуют (как минимум) три совершенно разные технологии одновременно. Эти технологии разработаны так, чтобы быть максимально гибкими, что только делает их более запутанными для начинающих. Мысль о том, что источник привязки может быть чем угодно, понять сложно. Идея, что расширение разметки - это особый формат сериализации, который поддерживает рекурсию: достаточно прост для понимания в принципе, но немного сбивает с толку, когда вы впервые начинаете работать с реальными примерами. Идея о том, что словарь ресурсов может содержать практически все, и что алгоритм поиска ресурсов по существу делает ресурсы наследуемыми: опять же, довольно прост в концепции, но легко потерять нить, когда вы пытаетесь выяснить привязку данных и XAML в в то же время.

Это разочаровывает, потому что то, что концептуально просто - «Я хочу связать этот элемент управления со свойством объекта, который я создал» - требует, чтобы вы поняли очень много вещей, прежде чем вы действительно сможете выразить это в XAML.

Единственное решение - набраться терпения и убедиться, что вы понимаете вещи на самом низком уровне. Когда вы видите это:

{StaticResource MyPerson}

вы должны подумать: «Это вызовет обработчик расширения разметки StaticResource, который извлекает объект из словаря ресурсов, используя ключ MyPerson, когда XAML десериализован.

Сначала это чрезвычайно сложно. Я профессионально занимаюсь разработкой программного обеспечения в течение 35 лет, и я обнаружил, что WPF - самая сложная технологическая платформа, которую я когда-либо изучал со значительным отрывом. Но все эти вещи трудно освоить, потому что они невероятно функциональны и гибки. И отдача от обучения огромна.

Чтобы решить пару вопросов, которые karmicpuppet не сделал:

Из моего опыта работы с MFC [ресурсы] были значки, строки и т. Д.

Это не изменилось. Вы по-прежнему можете создавать файлы ресурсов в WPF и загружать их в объекты во время выполнения. Есть много разных способов сделать это - вы можете создать ресурсы в редакторе ресурсов и загрузить их через объект Properties.Resources, вы можете добавить mage-файлы (например) для проекта, скомпилируйте их как ресурсы и загрузите их, используя их URI, и есть много других способов, о которых я не знаю.

Ресурсы, доступные для FrameworkElement через их словари ресурсов это совсем другое. Ну вроде. Вот пример:

<Window.Resources>
   <Image x:Key="MyImage" Source="images/myimage.png"/>
</Window.Resources>

Это создает объект Image и добавляет его в словарь ресурсов Window с ключом MyImage. Затем вы можете ссылаться на этот объект через StaticResource расширение разметки в XAML или метод FindResource в коде.

Установка атрибута Source для элемента Image в XAML также заставляет XamlReader использовать ResourceManager для чтения данных изображения из скомпилированных ресурсов проекта во время выполнения, когда он создает Image объект.

На практике это не так запутанно, как когда вы впервые изучаете WPF. Я никогда не получаю ресурсы, которые ResourceManager загружают, и ресурсы, хранящиеся в словарях ресурсов, смешиваются.

И когда именно этот объект был создан ?

Любой объект, определенный элементом XAML, создается, когда XamlReader читает элемент. Итак, это:

<Window.Resources>
   <local:Person x:Key="MyPerson"/>
</Window.Resources>

создает новый объект Person и добавляет его в словарь ресурсов Window с ключом MyPerson. Это в точности эквивалентно выполнению этого в коде Window:

AddResource("MyPerson", new Person());

Так почему бы вам просто не сделать это в коде? Две причины:

Во-первых, это соответствует. Если вы определяете все свои ресурсы в XAML, вам нужно только посмотреть в файлах XAML, чтобы найти ваши ресурсы. Если вы определяете их как в XAML, так и в коде, вы должны искать их в двух местах.

Во-вторых, IDE знает о ресурсах, которые вы определяете в XAML. Если вы введете

<TextBox Text="{Binding {StaticResource MyPerson}, Path=Name}"/>

в свой XAML, IDE сообщит вам, если вы не определили где-то в иерархии словарей ресурсов, ресурс, ключ которого - MyPerson. Но он не знает о ресурсах, которые вы добавили в код, и поэтому даже если этот ресурс действительно может быть найден во время выполнения, IDE сообщит об этом как о проблеме.

38
ответ дан 28 November 2019 в 03:11
поделиться

Подумайте об этом так: все элементы FrameworkElements (окна, кнопки, другие элементы управления и т. д.), а также объект приложения содержат словарь ресурсов. Всякий раз, когда вы определяете ресурс в XAML, как показано здесь:

<Window>
  <Window.Resources>
    <SolidColorBrush x:Key="myBrush" Color="Red"/>
    <DataTemplate x:Key"myTemplate">
      <!--Template definition here -->
    </DataTemplate>
  </Window.Resources>
</Window>

Это похоже на то, что вы делаете что-то подобное в коде:

class Window
{
  void Window()
  {
    this.Resources.Add("myBrush", new SolidColorBrush(Brushes.Red));
    this.Resources.Add("myTemplate", new DataTemplate());
  }
}

Вы можете поместить все виды объектов в качестве Ресурсов. Все, что вы хотели бы повторно использовать в своем приложении, вы можете определить как ресурс.

Теперь, когда вы используете «{StaticResource}» следующим образом:

<Button Background="{StaticResource myBrush}"/>

Это похоже на указание WPF искать соответствующий ресурс «myBrush» и применять его к свойству Background. Что произойдет, так это то, что WPF сначала будет искать ресурс в словаре ресурсов кнопки, и, если он не будет найден, будет искать его родителя, затем родителя его родителя и так далее до ресурсов приложения.

«Статический» элемент в «StaticResource» просто отличает его от другого типа поиска ресурсов, называемого «DynamicResource». Разница между ними указана в этой ссылке.

Аналогично работает и применительно к Binding. Скажем, например, у вас есть следующий ресурс в вашем XAML:

<local:Person x:Key="MyPerson" Name="Title"/>

и вы использовали его как:

<TextBlock Text="{Binding Source={StaticResource MyPerson}, Path=Name}"/>

В этом случае произойдет что-то вроде этого:

Binding b = new Binding();
b.Source = FindResource("MyPerson");
b.Path = "Name";
[TextBlock].SetBinding(TextBlock.TextProperty, b);

Опять же, разметка "{StaticResource}" в XAML сообщает WPF о необходимости поиска соответствующего ресурса и установки его в качестве значения свойства a. В этом случае свойство является свойством «Источник» Binding.

Это основа. Надеюсь, вы найдете это полезным

14
ответ дан 28 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: