Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2014, 12:17   #1
JunkieBeat
Пользователь
 
Регистрация: 17.02.2013
Сообщений: 38
По умолчанию Обработчики событий и XAML

Доброго времени суток.
Я пишу стиль для вкладки из TabControl (TabItem) , и в стиле добавил кнопку закрытия вкладки, но вот в обработчике событий не знаю как подкопаться к вкладке? Подскажите пожалуйста.
Вот сам стиль
Код:
 <TabControl  Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="tabControl1" VerticalAlignment="Stretch" Width="Auto" Background="LightGray" BorderBrush="{x:Null}" Foreground="DimGray" SelectionChanged="tabControl1_SelectionChanged" MouseLeftButtonDown="tabControl1_MouseLeftButtonDown">
            <TabControl.Resources>
                <Style TargetType="TabItem" >
                        <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="TabItem">
                               <Grid Name="Panel" MinHeight="30" MaxWidth="150" MinWidth="150">
                                    <ContentPresenter x:Name="ContentSite"
                                        VerticalAlignment="Center"
                                        HorizontalAlignment="Center"
                                        ContentSource="Header"
                                        Margin="10,2"/>
                                    <Border  BorderThickness="0.5" BorderBrush="DimGray"/>
                                    <Button HorizontalAlignment="Right" Content="x" BorderThickness="0"  Margin="0,-2,5,0" Width="10" Height="20" Style="{DynamicResource TabCloser}" Click="Button_Click" />
                                </Grid>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter TargetName="Panel" Property="Background" Value="#FFEEEEEE" />
                                    </Trigger>
                                    <Trigger Property="IsSelected" Value="False">
                                        <Setter TargetName="Panel" Property="Background" Value="LightGray" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </TabControl.Resources>
        </TabControl>
в обработчике кнопки пробовал пройтись по родителям но там упираюсь в пустого родителя
Код:
private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(((sender as Button).Parent as Grid).Parent.ToString());
        }
Вот у кнопки в родителях есть Грид, но у Грида в родителях уже null
JunkieBeat вне форума Ответить с цитированием
Старый 30.11.2014, 13:40   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А вкладки как добавляете?

Обычно в WPF используют Binding, MVVM и все такое вместо обработчиков событий в code behind.

С биндингом вроде бы можно было бы так легко получить вкладку (в CommandParameter):
Код:
RelativeSource={RelativeSource AncestorType={x:Type TabItem}}
Но я бы лучше прибиндил список к ItemsSource и уже из него удалял:

Код:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

namespace WpfApplication1.ViewModel
{
    public class MyTabData
    {
        // может понадобится добавить INotifyPropertyChanged если значения могут изменяться
        public string Name { get; set; }
    }

    public class ViewModel
    {
        public ViewModel()
        {
            Items = new ObservableCollection<MyTabData>();
            Items.Add(new MyTabData() { Name = "Tab1" });
            Items.Add(new MyTabData() { Name = "Tab2" });
            Items.Add(new MyTabData() { Name = "Tab3" });
        }

        public ObservableCollection<MyTabData> Items { get; set; }

        // RelayCommand отсюда http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030
        // https://gist.github.com/Alex11223/9d04356f1bfceb35975e
        // или возьмите лучше какой-нибудь MvvmLight
        private RelayCommand _deleteCommand;
        public ICommand DeleteCommand
        {
            get
            {
                return _deleteCommand ?? (_deleteCommand = new RelayCommand(
                    ExecuteDeleteCommand,
                    o => true));
            }
        }

        private void ExecuteDeleteCommand(object parameter)
        {
            var item = parameter as MyTabData;

            Items.Remove(item);
        }
    }
}
Код:
<Window ...
        xmlns:vm="clr-namespace:WpfApplication1.ViewModel">
    <Window.Resources>
        <vm:ViewModel x:Key="viewModel"/>
    </Window.Resources>
    <Grid DataContext="{StaticResource viewModel}" Name="grdRoot">
        <TabControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Background="LightGray" BorderBrush="{x:Null}"
                    ItemsSource="{Binding Items}">
            <TabControl.Resources>
                <Style TargetType="TabItem" >
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="TabItem">
                                <Grid Name="Panel" MinHeight="30" MaxWidth="150" MinWidth="150">
                                    <ContentPresenter x:Name="ContentSite"
                                        VerticalAlignment="Center" HorizontalAlignment="Center" ContentSource="Header" Margin="10,2"/>
                                    <Border  BorderThickness="0.5" BorderBrush="DimGray"/>
                                    <Button HorizontalAlignment="Right" Content="x" BorderThickness="0"  Margin="0,-2,5,0" Width="10" Height="20"
                                            Command="{Binding DataContext.DeleteCommand, ElementName=grdRoot}" CommandParameter="{Binding }" />
                                </Grid>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter TargetName="Panel" Property="Background" Value="#FFEEEEEE" />
                                    </Trigger>
                                    <Trigger Property="IsSelected" Value="False">
                                        <Setter TargetName="Panel" Property="Background" Value="LightGray" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </TabControl.Resources>
            
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding Name}" />
                    </Grid>
                </DataTemplate>
            </TabControl.ItemTemplate>
            
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <TextBlock Text="Hello"/>
                        <TextBlock Grid.Row="1" Text="{Binding Name}" />
                    </Grid>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.11.2014, 13:41   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

<лимит символов>

Ну или если так, то можно попробовать что-то такое:

Код:
        T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = System.Windows.Media.VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        } 

        private void Button_Click(object sender, RoutedEventArgs e)
        { 
            var btn = (Button) sender;

            var tabItem = FindVisualParent<TabItem>(btn);
            
            tabControl1.Items.Remove(tabItem);
        }
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.11.2014, 14:52   #4
JunkieBeat
Пользователь
 
Регистрация: 17.02.2013
Сообщений: 38
По умолчанию

Сама вкладка добавляется через c# по кнопке
Код:
private void NewTab(string URL,bool act=true)
        {
            TabItem ti = new TabItem();
            ti.Header = "Главная";
            tabControl1.Items.Insert(tabControl1.Items.Count, ti);
            WebControl W = new WebControl();
            W.Margin = new Thickness(0,25,0,0);
            W.WebSession = WebS;
            ti.Content = W;
            W.Source = URL.ToUri();
            if (act)
            {
                tabControl1.SelectedItem = ti;
                AWeb = W;
            }
            W.TitleChanged += new TitleChangedEventHandler(W_TitleChanged);
            W.AddressChanged += new UrlEventHandler(W_AddressChanged);
        }

Последний раз редактировалось JunkieBeat; 30.11.2014 в 14:56.
JunkieBeat вне форума Ответить с цитированием
Старый 30.11.2014, 15:32   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну должен работать тогда мой код получения TabItem'a.

Насчет изменения заголовка если еще нужно можете так сделать:

Код:
            W.TitleChanged += (sender, args) =>
            {
                ti.Header = args.Title;
            };
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 30.11.2014 в 15:40.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
App.xaml, MainPage.xaml, и тд. Chelovekpredel Общие вопросы .NET 0 19.12.2012 14:52
включить побочный Generic.xaml файл в основной App.xaml ImmortalAlexSan WPF, UWP, WinRT, XAML 1 21.09.2012 19:58
Обработчики событий мыши для компоненты Image Don Karleone Общие вопросы Delphi 12 22.07.2010 09:04
Обработчики событий формы Alexei_1986 Помощь студентам 5 18.02.2009 22:11