Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 除非主窗口处于活动状态,否则不会显示背景图像_C#_Wpf_Mvvm_Mvvm Light - Fatal编程技术网

C# 除非主窗口处于活动状态,否则不会显示背景图像

C# 除非主窗口处于活动状态,否则不会显示背景图像,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,我有一个讨厌的错误,我似乎无法弄明白,它是驾驶我疯狂。我有一个窗口,其中有一个列表框,当选择一个项目时,会使用mvvm灯打开一个新窗口,显示不同的详细信息,问题是当我单击列表框(BrowseGamesView)中的项目时,打开的新窗口(GameDetailsView)不会显示背景图像,除非我单击返回BrowseGamesView。我正在调用一个api并使用一个转换器来构建图像的url。我需要新窗口打开时显示的图像 <Window.Resources> <vm:GameD

我有一个讨厌的错误,我似乎无法弄明白,它是驾驶我疯狂。我有一个窗口,其中有一个列表框,当选择一个项目时,会使用mvvm灯打开一个新窗口,显示不同的详细信息,问题是当我单击列表框(BrowseGamesView)中的项目时,打开的新窗口(GameDetailsView)不会显示背景图像,除非我单击返回BrowseGamesView。我正在调用一个api并使用一个转换器来构建图像的url。我需要新窗口打开时显示的图像

<Window.Resources>
    <vm:GameDetailsViewModel x:Key="vm"/>
    <converters:StringToBackgroundImageConverter x:Key="stringToBackgroundImageConverter"/>
    <converters:StringToImageConverter x:Key="stringToImageConverter"/>
</Window.Resources>
<Grid DataContext="{StaticResource vm}">
    <Grid.Background>
        <ImageBrush ImageSource="{Binding Game.ScreenshotBackground, Converter={StaticResource stringToBackgroundImageConverter}}"/>
    </Grid.Background>
</Grid>
GameDetailsView

我需要在窗口打开时显示背景图像的位置

<Window.Resources>
    <vm:GameDetailsViewModel x:Key="vm"/>
    <converters:StringToBackgroundImageConverter x:Key="stringToBackgroundImageConverter"/>
    <converters:StringToImageConverter x:Key="stringToImageConverter"/>
</Window.Resources>
<Grid DataContext="{StaticResource vm}">
    <Grid.Background>
        <ImageBrush ImageSource="{Binding Game.ScreenshotBackground, Converter={StaticResource stringToBackgroundImageConverter}}"/>
    </Grid.Background>
</Grid>

BrowseGamesView

列表框所在的位置

<ListBox ItemsSource="{Binding Games}"
             ItemContainerStyle="{DynamicResource ListBoxItemStyle1}"
             SelectedItem="{Binding SelectedGame}"
             Width="480"
             Height="500"
             Grid.Row="4">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Image Source="{Binding cover.image_id, Converter={StaticResource stringToImage}}"
                           Stretch="Fill"
                           Width="100"
                           Height="130"/>
                    <Grid Grid.Column="1">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="310"/>
                                <ColumnDefinition Width="30"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="{Binding name}"
                                       Foreground="White"
                                       FontWeight="Bold"
                                       FontSize="16"
                                       Margin="15 2 0 0"
                                       TextWrapping="Wrap"/>

                            <TextBlock Text="{Binding aggregated_rating, StringFormat={}{0:F0}, Converter={StaticResource nullRatingConverter}}"
                                       Grid.Column="1"
                                       Foreground="{Binding AggregatedRatingColor}"
                                       FontWeight="Bold"
                                       FontSize="16"
                                       HorizontalAlignment="Center"/>
                        </Grid>

                        <ItemsControl Grid.Row="1"
                                      ItemsSource="{Binding DeveloperCompanies}"
                                      Margin="15 2 0 0">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <WrapPanel IsItemsHost="True"/>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock x:Name="commaTextBlock" 
                                                   Text=", "
                                                   Foreground="White"/>
                                        <TextBlock Text="{Binding company.name}"
                                                   Foreground="White"
                                                   TextWrapping="Wrap"/>
                                    </StackPanel>
                                    <DataTemplate.Triggers>
                                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}">
                                            <Setter Property="Visibility" TargetName="commaTextBlock" Value="Collapsed"/>
                                        </DataTrigger>
                                    </DataTemplate.Triggers>
                                </DataTemplate>

                            </ItemsControl.ItemTemplate>
                        </ItemsControl>

                        <Grid Grid.Row="2"
                              VerticalAlignment="Bottom"
                              Margin="0 0 0 4">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="Release Date:"
                                       Foreground="White"
                                       Margin="15 20 0 0"/>
                            <TextBlock Text="{Binding first_release_date, Converter={StaticResource unixTimestampToDateTimeConverter}}"
                                       Foreground="White"
                                       Margin="10 20 0 0"
                                       Grid.Column="1"/>
                        </Grid>
                    </Grid>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

GameDetailsViewModel

 public class GameDetailsViewModel : INotifyPropertyChanged
{
    private Game game;

    public Game Game
    {
        get { return game; }
        set
        {
            game = value;
            OnPropertyChanged("Game");
        }
    }

    public GameDetailsViewModel()
    {
        Messenger.Default.Register<Game>(this, NotifyMe);
    }

    public void NotifyMe(Game sentGame)
    {
        Game = sentGame;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
 public class BrowseGamesViewModel : ViewModelBase, INotifyPropertyChanged
{
    private string query;
    private Game selectedGame;
    private int gamesCount;
    private Game game;

    public RelayCommand ShowGameDetailsViewCommand { private set; get; }
    public string Query
    {
        get { return query; }
        set
        {
            query = value;
            OnPropertyChanged("Query");
        }
    }
    public Game Game
    {
        get { return game; }
        set
        {
            game = value;
            OnPropertyChanged("Game");
        }
    }

    public Game SelectedGame
    {
        get { return selectedGame; }
        set
        {
            selectedGame = value;
            OnPropertyChanged("SelectedGame");
            GetGameDetails();
            ShowGameDetailsViewCommandExecute();
        }
    }

    public ObservableCollection<Game> Games { get; set; }
    public int GamesCount
    {
        get { return gamesCount; }
        set
        {
            gamesCount = value;
            OnPropertyChanged("GamesCount");
        }
    }
    public SearchGamesCommand SearchGamesCommand { get; set; }

    public BrowseGamesViewModel()
    {
        Games = new ObservableCollection<Game>();
        SearchGamesCommand = new SearchGamesCommand(this);
        ShowGameDetailsViewCommand = new RelayCommand(ShowGameDetailsViewCommandExecute);
    }

    public void ShowGameDetailsViewCommandExecute()
    {
        Messenger.Default.Send(new NotificationMessage("ShowGameDetailsView"));
    }

    private async void GetGameDetails()
    {
        Game = await IGDBHelper.GetGameInformation(SelectedGame.id);
        Messenger.Default.Send(Game);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
公共类GameDetailsViewModel:INotifyPropertyChanged
{
私人游戏;
公共游戏
{
获取{返回游戏;}
设置
{
游戏=价值;
OnPropertyChanged(“游戏”);
}
}
公共游戏详细信息viewmodel()
{
Messenger.Default.Register(这个,NotifyMe);
}
公共无效通知我(游戏sentGame)
{
游戏=游戏;
}
公共事件属性更改事件处理程序属性更改;
受保护的无效OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
BrowseGamesViewModel

 public class GameDetailsViewModel : INotifyPropertyChanged
{
    private Game game;

    public Game Game
    {
        get { return game; }
        set
        {
            game = value;
            OnPropertyChanged("Game");
        }
    }

    public GameDetailsViewModel()
    {
        Messenger.Default.Register<Game>(this, NotifyMe);
    }

    public void NotifyMe(Game sentGame)
    {
        Game = sentGame;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
 public class BrowseGamesViewModel : ViewModelBase, INotifyPropertyChanged
{
    private string query;
    private Game selectedGame;
    private int gamesCount;
    private Game game;

    public RelayCommand ShowGameDetailsViewCommand { private set; get; }
    public string Query
    {
        get { return query; }
        set
        {
            query = value;
            OnPropertyChanged("Query");
        }
    }
    public Game Game
    {
        get { return game; }
        set
        {
            game = value;
            OnPropertyChanged("Game");
        }
    }

    public Game SelectedGame
    {
        get { return selectedGame; }
        set
        {
            selectedGame = value;
            OnPropertyChanged("SelectedGame");
            GetGameDetails();
            ShowGameDetailsViewCommandExecute();
        }
    }

    public ObservableCollection<Game> Games { get; set; }
    public int GamesCount
    {
        get { return gamesCount; }
        set
        {
            gamesCount = value;
            OnPropertyChanged("GamesCount");
        }
    }
    public SearchGamesCommand SearchGamesCommand { get; set; }

    public BrowseGamesViewModel()
    {
        Games = new ObservableCollection<Game>();
        SearchGamesCommand = new SearchGamesCommand(this);
        ShowGameDetailsViewCommand = new RelayCommand(ShowGameDetailsViewCommandExecute);
    }

    public void ShowGameDetailsViewCommandExecute()
    {
        Messenger.Default.Send(new NotificationMessage("ShowGameDetailsView"));
    }

    private async void GetGameDetails()
    {
        Game = await IGDBHelper.GetGameInformation(SelectedGame.id);
        Messenger.Default.Send(Game);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
公共类BrowseGamesViewModel:ViewModelBase,INotifyPropertyChanged
{
私有字符串查询;
私人游戏选择游戏;
私人游戏公司;
私人游戏;
public RelayCommand ShowGameDetailsViewCommand{private set;get;}
公共字符串查询
{
获取{return query;}
设置
{
查询=值;
OnPropertyChanged(“查询”);
}
}
公共游戏
{
获取{返回游戏;}
设置
{
游戏=价值;
OnPropertyChanged(“游戏”);
}
}
公共游戏选择名称
{
获取{return selectedGame;}
设置
{
selectedGame=值;
OnPropertyChanged(“SelectedName”);
GetGameDetails();
ShowGameDetailsViewCommandExecute();
}
}
公共可观测集合游戏{get;set;}
公共游戏中心
{
获取{return gamesCount;}
设置
{
gamesCount=价值;
OnPropertyChanged(“GamesCount”);
}
}
公共搜索游戏命令和搜索游戏命令{get;set;}
公共浏览器gamesviewmodel()
{
Games=新的可观测集合();
SearchGamesCommand=新的SearchGamesCommand(此);
ShowGameDetailsViewCommand=新的RelayCommand(ShowGameDetailsViewCommandExecute);
}
public void ShowGameDetailsViewCommandExecute()
{
senger.Default.Send(新通知消息(“ShowGameDetailsView”);
}
私有异步void GetGameDetails()
{
Game=wait IGDBHelper.GetGameInformation(SelectedGame.id);
Messenger.Default.Send(游戏);
}
公共事件属性更改事件处理程序属性更改;
受保护的无效OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
BrowseGamesView代码隐藏

public partial class BrowseGamesView : Window
{
    public BrowseGamesView()
    {
        InitializeComponent();
        Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived);
    }

    private void NotificationMessageReceived(NotificationMessage msg)
    {
        if (msg.Notification == "ShowGameDetailsView")
        {
            var view = new GameDetailsView();
            view.Show();
        }
    }
}
public分部类BrowseGamesView:窗口
{
公共浏览器gamesview()
{
初始化组件();
Messenger.Default.Register(此为NotificationMessageReceived);
}
收到私有无效NotificationMessage(NotificationMessage消息)
{
如果(msg.Notification==“ShowGameDetailsView”)
{
var view=newgamedetailsview();
view.Show();
}
}
}

当这让你抓狂时,一个明智的方法是降低代码复杂性。只需将主视图模型的SelectedName直接传递给details视图中的游戏属性。扔掉细节视图的视图模型和所有那些花哨的messenger东西。我不明白为什么GameDetailsView应该有自己的私有视图模型,而你可以简单地将当前游戏分配给它的DataContext。所以你是说删除GameDetailsView