Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Габариты ListBoxItem / 12 сообщений из 12, страница 1 из 1
27.05.2013, 08:53
    #38274201
ЧитательX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
Возможно где-то есть на это ответ, но не нашел.
Есть ListBox со своими item-ами. Как для некоторого item-а определить его высоту и ширину?
Мне нужно под эти размеры подстраивать размеры других контролов.
...
Рейтинг: 0 / 0
28.05.2013, 06:20
    #38275753
ЧитательX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
Что никто ничего не знает?
Я пробовал таким образом получить высоту и ширину:
Код: c#
1.
ListBoxItem item = MyListBox.ItemContainerGenerator.ContainerFromItem(MyDataItem) as ListBoxItem;


но свойства item.Width и item.Height дают NaN ???
Как добраться до геометрии элемента?
...
Рейтинг: 0 / 0
28.05.2013, 07:06
    #38275759
skole
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
Неправильный подход, такие вещи в WPF делаются на уровне темплейтов.
...
Рейтинг: 0 / 0
28.05.2013, 12:27
    #38276247
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
ЧитательX,

да, тебе надо почитать про идеологию контролов в wpf.
ты пытаешься идеологию winforms насадить и получаются такие вопросы.
...
Рейтинг: 0 / 0
29.05.2013, 07:58
    #38277768
ЧитательX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
Да, в ListBoxItem находится Template, но причем здесь он?
Есть ListBox у которого есть набор ListBoxItem-ов с разными размерами. Неважно что ListBoxItem содержит внутри, его размер это атрибут самого ListBoxItem. Я готов связать размер ListBoxItem с нужными мне контролами не залезая в C#-код, но как это сделать? Если даже на уровне C# я с трудом получаю размеры элемента.
...
Рейтинг: 0 / 0
08.06.2013, 00:23
    #38291119
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
ЧитательX,

На "уровне" С# с трудом ничего получать не надо. Паттерн mvvm как бы намекает, что вьюмодел ничего о представлении не знает. Поэтому и с трудом.
...
Рейтинг: 0 / 0
08.06.2013, 10:42
    #38291203
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
ЧитательX,

Я сталкивался с такой проблемой. Решение - на OnLoad листбокса перебрать все его ListBoxItems, у каждого влезть внутрь ContentPresenter, там найти именованный внешний элемент темплейта (Border, Grid, StackPanel, etc), и у него взять ActualWidth/ActualHeight. Нюанс метода в том, что для определения размеров всех элементов листбокса (чтобы найти элемент с макс. размером) придется отключить виртуализацию листбокса - при включенной виртуализации те элементы, которые не видны в скроллере листбокса, как бы не существуют, и их размеры не определить никак.
Если это устраивает - вот тестовый пример:
разметка:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<Window.Resources>
  <DataTemplate x:Key="foo">
    <Border
      x:Name="MonthBorder"
      Background="Red"
      Margin="3"
      Width="{Binding Width}">
      <TextBlock
        Margin="3"
        Text="{Binding Name}"/>
    </Border>
  </DataTemplate>
</Window.Resources>
<ListBox
  x:Name="lbMonths"
  ItemsSource="{Binding Months}"
  ItemTemplate="{StaticResource foo}"
  VirtualizingStackPanel.IsVirtualizing="False"/> <!-- отключает виртуализацию -->


код:
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
public partial class MainWindow
{
  public MainWindow()
  {
    InitializeComponent();
    var sd = new DateTime(2013, 1, 1);
    Months = new List<Month>();
    Months.AddRange(Enumerable.Range(0, 12).Select(n =>new Month
    {
      Name = sd.AddMonths(n).ToString("MMMM", CultureInfo.InvariantCulture)
    }));
    DataContext = this;
    lbMonths.Loaded += AdjustItemsSize;
  }

  public List<Month> Months { get; private set; }

  void AdjustItemsSize(object sender, RoutedEventArgs e)
  {
    var maxLength = Months.Max(m =>
    {
      var itemContainer = lbMonths.ItemContainerGenerator.ContainerFromItem(m);
      if (itemContainer==null) return 0;
      var cp = itemContainer.GetVisualChild<ContentPresenter>();
      if (cp==null) return 0;
      var border = cp.ContentTemplate.FindName("MonthBorder", cp) as Border;
      return border == null ? 0 : border.ActualWidth;
    });
    if (maxLength==0) return;
    Months.ForEach(m=>m.SetWidth(maxLength));
  }
}

public class Month: INotifyPropertyChanged
{
  public Month()
  {
    Width = Double.NaN;
  }

  public void SetWidth(double value)
  {
    Width = value;
    if (PropertyChanged!=null)
      PropertyChanged(this, new PropertyChangedEventArgs("Width"));
  }

  public string Name { get; set; }
  public double Width { get; set; }
  public event PropertyChangedEventHandler PropertyChanged;
}


В методе AdjustItemSize используется метод GetVisualChild<T> - этого метода нет в классах фреймворка, он самописный:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public static class DependencyObjectExtensions
{
  public static T GetVisualChild<T>(this DependencyObject parent) where T : Visual
  {
    var child = default(T);
    var numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (var i = 0; i < numVisuals; i++)
    {
      var v = (Visual)VisualTreeHelper.GetChild(parent, i);
      child = v as T ?? GetVisualChild<T>(v);
      if (child != null)
        break;
    }
    return child;
  }
}
...
Рейтинг: 0 / 0
08.06.2013, 11:00
    #38291210
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
ЧитательXВозможно где-то есть на это ответ, но не нашел.
Есть ListBox со своими item-ами. Как для некоторого item-а определить его высоту и ширину?
Мне нужно под эти размеры подстраивать размеры других контролов.Это решается на уровне Panel. Читать про компоновку в WPF: MeasureOverride(), ArrangeOverride().
...
Рейтинг: 0 / 0
02.08.2013, 05:15
    #38352350
ЧитательX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
Я на некоторое время выпал из беседы. Спасибо за подсказки!
...
Рейтинг: 0 / 0
03.08.2013, 01:58
    #38353734
unknownfromrus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
Сон Веры Павловны,

Не WPF-ский подход. Я бы сказал что ты решил лопатой хлеб нарезать.
А вот Алексей К очень разумную идею подкинул (одну из идей)
...
Рейтинг: 0 / 0
06.08.2013, 14:06
    #38356602
mr Vap
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
unknownfromrus,

Код: xml
1.
2.
3.
<Grid.Width>
     <Binding Path="ActualWidth" RelativeSource="{RelativeSource FindAncestor, AncestorType=ScrollContentPresenter, AncestorLevel=1}" UpdateSourceTrigger="PropertyChanged" />
</Grid.Width>
...
Рейтинг: 0 / 0
06.08.2013, 23:16
    #38357544
unknownfromrus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Габариты ListBoxItem
unknownfromrus,

Хотя невнимательно вначале прочитал. Идея тоже разумная.
Тем более я сам для разных задач вытаскиваю нужные мне паренты и чайлды (через VisualTreeHelper)
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Габариты ListBoxItem / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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