Нахождение элемента управления внутри другого элемента управления в WPF - PullRequest
1 голос
/ 30 декабря 2011

Поскольку в WPF нет кнопки ссылки, я создал кнопку ссылки с помощью элементов управления гиперссылкой и текстового блока.

Есть 3 элемента управления:

<TextBlock  Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Left"  >                
     <Hyperlink Name="hyplnkIsActiveMarkets"  Click="hyplnkIsActive_Click" Foreground="Blue"  >  
         <TextBlock Name="txtblkIsActiveMarkets" Text="Active"  />     
     </Hyperlink>
 </TextBlock>
 <TextBlock  Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left">                
     <Hyperlink Name="hyplnkIsActiveBudgets"  Click="hyplnkIsActive_Click" Foreground="Blue"  >  
         <TextBlock Name="txtblkIsActiveBudgets"  Text="Active"  />     
     </Hyperlink>
</TextBlock>
<TextBlock  Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Left">                
     <Hyperlink Name="hyplnkIsActivePrograms"  Click="hyplnkIsActive_Click" Foreground="Blue"  >  
         <TextBlock Name="txtblkIsActivePrograms"  Text="Active"  />     
     </Hyperlink>
</TextBlock>

Все кнопки ссылок вызывают один и тот же метод клика

private void hyplnkIsActive_Click(object sender, RoutedEventArgs e)
{
    Hyperlink objHyperlink = (Hyperlink)sender;
    TextBlock objTextBlock = new TextBlock();

    if (objHyperlink == hyplnkIsActiveMarkets)
    {
        objTextBlock = txtblkIsActiveMarkets;
    }
    else if (objHyperlink == hyplnkIsActiveBudgets)
    {
        objTextBlock = txtblkIsActiveBudgets;
    }
    else if (objHyperlink == hyplnkIsActivePrograms)
    {
        objTextBlock = txtblkIsActivePrograms;
    }

    if (objTextBlock.Text == "Active")
        ChangeHyperLinkStatus(objHyperlink, objTextBlock, Status.Inactive);
    else ChangeHyperLinkStatus(objHyperlink, objTextBlock, Status.Active);
}

В методе щелчка я проверяю текстовый блок внутри гиперссылки индивидуально, используя условие if.

Есть ли более простой способ сделать это? Это в основном нахождение контроля внутри элемента управления?

Ответы [ 3 ]

2 голосов
/ 30 декабря 2011

ОБНОВЛЕНИЕ: вы не можете использовать VisualTreeHelper.GetParent (...), чтобы получить родительский элемент вашей гиперссылки, поскольку вы упомянули, что гиперссылка не является визуальной.исправил ответ.

См. Код ниже.

private void hyplnkIsActive_Click(object sender, RoutedEventArgs e)
{
    Hyperlink objHyperlink = (Hyperlink)sender;
    TextBlock objTextBlock  = (TextBlock)LogicalTreeHelper.GetChildren(objHyperlink)[0]; 
   // This will give logical tree first child of objHyperlink


    if (objTextBlock.Text == "Active")
        ChangeHyperLinkStatus(objHyperlink, objTextBlock, Status.Inactive);
    else 
        ChangeHyperLinkStatus(objHyperlink, objTextBlock, Status.Active);
}

См. Эту статью о логическом дереве в MSDN

1 голос
/ 30 декабря 2011

Я думаю, что вы идете в неправильном направлении, передавая логику выполнения на controls и , а не на data.

Вы можете, например, связать ICommand или RelayCommand с кнопками, или просто подписаться на разные события, или определить пользовательский DataTemplate, где при нажатии мыши элемент управления, по нажатию на который можно назначить некоторому свойству ModelView ,

Поступая так, вы создаете жесткую связь между пользовательским интерфейсом и логикой выполнения. В этом случае проще использовать WindowsForm, чем WPF.

0 голосов
/ 30 декабря 2011

Я наконец понял.Спасибо Махипу за помощь

 TextBlock objTextBlock = (TextBlock)LogicalTreeHelper.GetChildren(objHyperlink).Cast<System.Windows.Documents.InlineUIContainer>().FirstOrDefault().Child;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...