XAML 内容未显示

h7appiyu  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(141)

不幸的是,我无法理解哪里有实现错误。主应用程序窗口应该显示一个视图模型(HomeView.xaml)的内容,你能告诉我,我做错了什么吗?提前感谢。
https://i.stack.imgur.com/mq3PS.png显示器
MainWindow.xaml.cs

using ohb.MVVM.ViewModel;

namespace ohb
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
this.DataContext = new HomeViewModel();  

        }

    // Moveable window
        private void WindowMouseMoving(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                this.DragMove();
            }
        }
  
    // Exit button
    private void CloseButtonClick(object sender, RoutedEventArgs e)
    {
            Close();
    }
    }
}

MainWindow.xaml

<Window x:Class="ohb.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ohb"
    xmlns:viewModel="clr-namespace:ohb.MVVM.ViewModel"
        xmlns:view="clr-namespace:ohb.MVVM.View"
        mc:Ignorable="d"
        Height="600" Width="920"
    WindowStyle="None"
    ResizeMode="NoResize"
    Background="Transparent"
    AllowsTransparency="True"
    MouseMove="WindowMouseMoving">

<Window.DataContext>
        <viewModel:MainViewModel/>
</Window.DataContext>

    
        
    <Border Background="#2f4f4f"
        CornerRadius="30">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="200"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="75"/>
                <RowDefinition/>
            </Grid.RowDefinitions>

        <TextBlock Text="Application"
            VerticalAlignment="Center"
            HorizontalAlignment="Left"
            Foreground="White"
            FontSize="22"
            Margin="20,0,0,0"/>

        <StackPanel Grid.Row="1">

            <RadioButton Content="Home"
                Height="50"
                Foreground="White"
                FontSize="14"
                Style="{StaticResource MenuButtonTheme}"
                IsChecked="True"
                Command="{Binding HomeViewCommand}"/>

            <RadioButton Content="Menu"
                Height="50"
                Foreground="White"
                FontSize="14"
                Style="{StaticResource MenuButtonTheme}"
                Command="{Binding DiscoveryViewCommand}"/>

            <RadioButton Content="Settings"
                Height="50"
                Foreground="White"
                FontSize="14"
                Style="{StaticResource MenuButtonTheme}"/>

            <RadioButton Content="Exit"
                Click="CloseButtonClick"
                Height="50"
                Foreground="White"
                FontSize="14"
                        Style="{StaticResource MenuButtonTheme}"/>

        </StackPanel>

            <TextBox Width="250"
                 Height="40"
                 VerticalContentAlignment="Center"
                 HorizontalAlignment="Left"
                 Margin="5"
                 Grid.Column="1"
                 Style="{StaticResource TextBoxTheme}"/>

            <ContentControl Grid.Row="1"
                    Grid.Column="1"
                    Margin="10"
                    Content="{Binding CurrentView}"/>


        </Grid>
    </Border>
</Window>

App.xaml

<Application x:Class="ohb.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:ohb"
         xmlns:viewModel="clr-namespace:ohb.MVVM.ViewModel"
             xmlns:view="clr-namespace:ohb.MVVM.View"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
         <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Theme/MenuButtonTheme.xaml"/>
                    <ResourceDictionary Source="Theme/TextBoxTheme.xaml"/>
        </ResourceDictionary.MergedDictionaries>
      

    <DataTemplate DataType="{x:Type viewModel:HomeViewModel}">
                <view:HomeView/>
        </DataTemplate>

         </ResourceDictionary>
    </Application.Resources>
</Application>

MenuButtonTheme.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style BasedOn="{StaticResource {x:Type ToggleButton}}"
           TargetType="{x:Type RadioButton}"
           x:Key="MenuButtonTheme"> 
        <Style.Setters> 
            <Setter Property="Template">
                <Setter.Value>
                  
                    <ControlTemplate TargetType="RadioButton">
                        <Grid VerticalAlignment="Stretch"
                              HorizontalAlignment="Stretch"
                              Background="{TemplateBinding Background}">

              
                            <TextBlock Text="{TemplateBinding Property=Content}"
                                       VerticalAlignment="Center"
                                       Margin="50,0,0,0"/>
                        </Grid>
                        </ControlTemplate>
                </Setter.Value>
            </Setter>

                  <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="0"/>
        </Style.Setters>
        
        <Style.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Background" Value="#3b6363"/>
            </Trigger>
        </Style.Triggers>

    </Style>
</ResourceDictionary>

TextBoxTheme.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type TextBox}"
           x:Key="TextBoxTheme">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border CornerRadius="10"
                Background="#3b6363"
                Width="200" Height="40">

                        <Grid>
                <Rectangle StrokeThickness="1"/>
                            <TextBox Margin="1"
                     BorderThickness="0"
                                     Background="Transparent"
                                     VerticalContentAlignment="Center"
                                     Padding="5"
                                     Foreground="White"
                     x:Name="SearchBox"/>

                <TextBlock IsHitTestVisible="False"
                Text="Search"
                VerticalAlignment="Center"
                HorizontalAlignment="Left"
                Margin="10,0,0,0"
                Foreground="DarkGray"
                Grid.Column="1"
                FontSize="12">

                <TextBlock.Style>
                    <Style TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                <DataTrigger Binding="{Binding Text, ElementName=SearchBox}" Value="">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
                    </Style.Triggers>
                    <Setter Property="Visibility" Value="Hidden"/>
                    </Style>
                </TextBlock.Style>

                </TextBlock>

                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

ObservableObject.cs

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace ohb.Core
{

    class ObservableObject : INotifyPropertyChanged

    {
public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged([CallerMemberName] string name = null)
        
        {
            if (PropertyChanged != null)
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

        } 

    }

}

RelayCommand.cs

using System.Windows.Input;

namespace ohb.Core
{
    public class RelayCommand : ICommand
    {
        private Action<object> execute;
        private Func<object, bool> canExecute;
 
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
 
        public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            this.execute = execute;
            this.canExecute = canExecute;
        }
 
        public bool CanExecute(object parameter)
        {
            return this.canExecute == null || this.canExecute(parameter);
        }
 
        public void Execute(object parameter)
        {
            this.execute(parameter);
        }
    }
}

MainViewModel.cs

using System;
using ohb.Core;

namespace ohb.MVVM.ViewModel
{
    class MainViewModel : ObservableObject
    {
        
        public RelayCommand HomeViewCommand { get; set; }

        public HomeViewModel HomeVM { get; set; }

              
        private object _currentView;

        public object CurrentView 
        {
            get { return _currentView; } 
            set
            {
                _currentView = value;
                OnPropertyChanged();
            }
        }
        

        public MainViewModel()
        {
            HomeVM = new HomeViewModel();

            
            CurrentView = HomeVM;
            

            HomeViewCommand = new RelayCommand(o =>
            {
                CurrentView = HomeVM;
            });
            
        }
    }
}

HomeViewModel.cs

using ohb.Core;

namespace ohb.MVVM.ViewModel
{
    class HomeViewModel
    {

    }
}

HomeView.xaml

<UserControl x:Class="ohb.MVVM.View.HomeView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:viewModel="clr-namespace:ohb.MVVM.ViewModel"
             xmlns:view="clr-namespace:ohb.MVVM.View"
    mc:Ignorable="d"
    d:DesignHeight="450" d:DesignWidth="800">

<UserControl.DataContext>
        <viewModel:HomeViewModel/>
</UserControl.DataContext>

<StackPanel>
    <TextBlock Text="Discover"
    Foreground="White"
    FontSize="28"
    HorizontalAlignment="Left"
    Margin="0,0,0,20"/>

    <StackPanel Orientation="Horizontal"
            Margin="0,0,0,10">
        <Border Width="400"
            Height="200">

        <Border.Background>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,2">
            <GradientStop Color="#5bc3ff" Offset="0"/>
            <GradientStop Color="#3aa0ff" Offset="1"/>
            </LinearGradientBrush>
        </Border.Background>

        <Border.Clip>
            <RectangleGeometry RadiusX="10"
                       RadiusY="10"
                       Rect="0,0,400,200"/>
        </Border.Clip>

        <Grid>
            <StackPanel>
            <TextBlock Text="World leader&#x0a;in global"
                   Foreground="White"
                   FontSize="28"
                   Margin="20,10,10,0"/>

            <TextBlock Text="Get started"
                   Foreground="White"
                   FontSize="18"
                   Margin="20,10,10,0"/>
            </StackPanel>

        </Grid>

        </Border>   

<Border Width="200" 
    Height="200"
    CornerRadius="10"
    Margin="45,0,0,0">

        <Border.Background>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,2">
            <GradientStop Color="#5bc3ff" Offset="0"/>
            <GradientStop Color="#3aa0ff" Offset="1"/>
            </LinearGradientBrush>
        </Border.Background>

</Border>
    </StackPanel>

<StackPanel>

<StackPanel.Resources>
    <Style TargetType="{x:Type Border}">
        <Setter Property="Margin" Value="15,0,0,0"/>
    </Style>
</StackPanel.Resources>

    <TextBlock Text="most watched"
    Foreground="White"
    FontSize="20"
    HorizontalAlignment="Left"
    Margin="0,0,0,10"/>

    <StackPanel Orientation="Horizontal">
        <Border Width="150"
            Height="150"
            Background="#844eff"
            CornerRadius="10"
            Margin="0"/>

        <Border Width="150"
            Height="150"
            Background="Red"
            CornerRadius="10"/>

        <Border Width="150"
            Height="150"
            Background="Gray"
            CornerRadius="10"/>

        <Border Width="150"
            Height="150"
            Background="Green"
            CornerRadius="10"/>

    </StackPanel>
</StackPanel>
</StackPanel>
</UserControl>
y4ekin9u

y4ekin9u1#

UserControl不能显式设置它自己的DataContext,因为您已在HomeView.xaml中将它声明为

<UserControl.DataContext>
    <viewModel:HomeViewModel/>
</UserControl.DataContext>

此赋值会破坏DataContext属性的value inheritance,该属性是使下面的DataTemplate正常工作所必需的。控件将始终使用显式设置的DataContext,而不是获取当前数据项作为其DataContext。

<DataTemplate DataType="{x:Type viewModel:HomeViewModel}">
    <view:HomeView/>
</DataTemplate>

因此,只需从UserControl的XAML中删除DataContext分配即可。

相关问题