Программное переключение вкладок в элементе управления вкладками - PullRequest
0 голосов
/ 15 марта 2019

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

У меня есть главное окно, с которым связан элемент управления вкладками, и оно направляет на разные страницы.Я хочу переключиться на вкладку из события, вызванного в другой вкладке.Когда я пытаюсь использовать TabControl.SelectedIndex, я получаю сообщение об ошибке «Требуется ссылка на объект для доступа к нестатическому методу или свойству 'MainWindow.tabControl'

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

<TabControl Name="tabControl" Margin="0,117,0,0" SelectionChanged="tabControl_SelectionChanged" Background="{x:Null}" BorderBrush="Black">
        <TabItem x:Name="tabMO" Header="MO" IsTabStop="False">
            <Viewbox x:Name="viewMO" Margin="0,0,0,0" Stretch="Fill" StretchDirection="Both">
                <local:ManufacturingOrder x:Name="mo" Height="644" Width="1322"/>
            </Viewbox>
        </TabItem>
        <TabItem x:Name="tabOptimize" Header="Optimize" IsTabStop="False">
            <Viewbox x:Name="viewOptimize" Margin="0,0,0,0" Stretch="Fill" StretchDirection="Both">
                <local:EngineeringOptimization x:Name="Optimize" Height="644" Width="1600"/>
            </Viewbox>
        </TabItem>

</TabControl>



private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        var cellInfo = dataGrid.SelectedCells[0];
        var content = (cellInfo.Column.GetCellContent(cellInfo.Item) as TextBlock).Text;
        var r = new Regex("[M][0-9]{6}");

        if (r.IsMatch(content.ToString()))
        {
            MainWindow.tabControl.SelectedIndex = 4;
        }
}

Я попытался переключить это на частный статический вакуум и получил ту же ошибку.

Я также попробовал следующий код, создаваяэкземпляр MainWindow, и ошибок нет, но когда я запускаю код, выбранная вкладка не меняется на экране. Но если я использую MessageBox для просмотра выбранного индекса, то я вижу свою измененную вкладку Index.

       private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        var cellInfo = dataGrid.SelectedCells[0];
        var content = (cellInfo.Column.GetCellContent(cellInfo.Item) as TextBlock).Text;
        var r = new Regex("[M][0-9]{6}");

        if (r.IsMatch(content.ToString()))
        {
            MainWindow frm = new MainWindow();
            frm.tabControl.SelectedIndex = 4;
        }
}

Любое понимание приветствуется.

1 Ответ

0 голосов
/ 16 марта 2019

Похоже, ваша основная проблема в том, что у вас нет легкого доступа к вашему MainWindow и всем его дочерним элементам из ваших ManufacturingOrder или EngineeringOptimization пользовательских элементов управления.Что нормально.Есть несколько способов обойти это.Простой, который нарушает некоторые принципы MVVM (но вы все равно делаете это, так что я не думаю, что вы будете возражать) - это получить экземпляр вашего объекта MainWindow:

//Loop through each open window in your current application.
foreach (var Window in App.Current.Windows)
{
  //Check if it is the same type as your MainWindow
  if (Window.GetType() == typeof(MainWindow))
  {
    MainWindow mWnd = (MainWindow)Window;
    mWnd.tabControl.SelectedIndex = 4;
  }
}

Как только вы получите работающий экземпляр вашего MainWindow, у вас будет доступ ко всем его членам.Это было протестировано, насколько это возможно, без доступа к вашим пользовательским пользовательским элементам управления и экземплярам.Но это довольно стандартная проблема и решение.

Вы были на правильном пути с вашим последним битом кода в вашем вопросе, но вы создавали «новый» экземпляр вашего MainWindow.Вы должны получить текущий запущенный экземпляр, а не новый экземпляр.

...