Как проверить определение столбца сетки?

Я делаю вид дизайнера WPF. Я хочу узнать, ColumnDefinition я нажал, чтобы удалить его из управления сеткой. Я позабочусь о тех детях, которые «находятся в этом ColumnDefinition». Могу ли я получить его из аргумента sender обработчика события клика? Теперь я проверяю, находится ли e.GetPosition в диапазоне ColumnDefinition.ActualWidth, но мне интересно, есть ли более красивое решение.


person Vladimir Nani    schedule 29.11.2011    source источник
comment
чего вы пытаетесь достичь? Удаление ColumnsDefiniton не удалит дочерний элемент вашей сетки. Вам нужно вызвать grid.Children.Remove(child), чтобы удалить визуальный дочерний элемент из сетки.   -  person    schedule 29.11.2011


Ответы (2)


Из обработчика события клика:

int columnIndex = Grid.GetColumn((UIElement)sender);

где отправитель является дочерним элементом прямой сетки.

person Community    schedule 29.11.2011

Зачем вам вообще нужно фиксировать щелчок на ColumnDefinition? Является виртуальным, у него нет реального тела, это всего лишь подсказка для Grid о том, как вы хотите разместить его содержимое. Таким образом, вы должны установить обработчики для объектов контента, а не для ColumnDefinition.

Если вам действительно нужно зафиксировать щелчок по всей поверхности ячейки сетки, вы можете попробовать поместить внутри нее белый (или другой цвет, такой же, как фон) Reactangle и зафиксировать щелчок по нему.

Некоторое пояснение о том, как работает WPF Grid. Когда вы добавляете некоторые элементы управления в сетку, все они становятся ее дочерними элементами.

<Grid>
    <Button/>
    <TextBox/>
    <Label/>
</Grid>

И все они будут отображаться независимо от того, как вы настроили Column или RowDefinitions. Column и RowDefinitions только сообщают Grid, как вы хотите объединить все существующие элементы внутри него, но они не являются контейнерами, они не содержат элементов внутри.

<Grid>
    <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions> 
    <Button/><!-- this is identical to Grid.Column="0"-->
    <TextBox Grid.Column="1"/>
    <Label Grid.Column="2"/>
</Grid>

В этом примере мы создали три ColumnDefinitions, даже из сетки XAML вы можете видеть, что элементы управления не находятся внутри определений. Они используются так же, как направляющие линейки для выравнивания содержимого. Затем вы устанавливаете прикрепленные свойства для элементов, чтобы сообщить сетке, где вы хотите поместить свои элементы. Когда сетка начнет компоновку, она увидит, что есть три элемента и три ColumnDefinitions, и попытается расположить элементы так, как говорит ColumnDefinitions. Но если вы удалите или измените ColumnDefinitions во время выполнения, сетка просто перестроит элементы управления по-новому. Если вы хотите скрыть некоторые элементы, вам нужно скрыть их, а не ColumnDefinition.

person Vladimir Perevalov    schedule 29.11.2011
comment
мне нужно удалить его или внести изменения в ширину - person Vladimir Nani; 29.11.2011
comment
Если вы удалите ColumnDefinition, вы просто уничтожите свой макет сетки, но не удалите содержимое. Вы не понимаете, как работает Grid. - person Vladimir Perevalov; 29.11.2011
comment
Вы видите, что я делаю дизайнер, и я намеренно хочу удалить ColumnDefinition, учитывая изменение макета тех детей, которые были внутри. - person Vladimir Nani; 29.11.2011