2017-03-26 1 views
0

나는 각 그리드가 게임 룸의 역할을하는 비디오 게임을 만들고 있습니다. 각 그리드 룸에는 사용할 수있는 것과 같은 많은 수의 오브젝트, 이미지 및 사운드 파일이 있습니다. 지금까지는 모두 하나의 큰 파일에 저장되었습니다. 그러나 이제는이 접근법이 많은 자원을 낭비한다고 들었습니다.파일에서 xaml 코드로 그리드로드하기, 메인 코드에서 활성화시키기

내 계획은 이러한 모든 그리드의 xaml 코드를 별도의 파일로 저장 한 다음 런타임에 관련 코드를 일반적인 코드로로드하는 것입니다. 대한

지금 XAML은 다음과 같이 약 같습니다

<Window 
    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" 
    mc:Ignorable="d" x:Name="wdwMain" x:Class="RealityIncognita.MainWindow" 
    Height="900" Width="1600" ResizeMode="NoResize" WindowState="Maximized" 
    Cursor="Cross" WindowStyle="None" Loaded="wdwMain_Loaded"> 
    <Viewbox Stretch="Fill"> 
    <Grid x:Name="areaContainer" HorizontalAlignment="Left" Height="900" 
    VerticalAlignment="Top" Width="1600"> 
     <Grid x:Name="areaMain"> 
      <Grid.Background> 
       <ImageBrush 
    ImageSource="Resources/Images/Interface/main_interface.jpg"/> 
      </Grid.Background> 
    <Grid x:Name="areaShowers" HorizontalAlignment="Left" Height="700" 
    Margin="1653,790,-1561,-590" VerticalAlignment="Top" Width="1508" 
    IsVisibleChanged="areaShowers_IsVisibleChanged"> 

을 다음 예제 - areaShowers 관련 룸 그리드입니다. 지금까지는 메인 그리드와 마찬가지로 다른 모든 그리드와 마찬가지로 메인 파일에 저장되어 있었고 필요할 때 마진을 변경하여 "areaMain"(그리드)에 배치했습니다.

이제 각 룸을 파일에 넣은 다음 필요할 때로드하고 싶지 않을 때 메모리에서 제거하려고합니다.

예를 들어, 빈 그리드 "areaGeneric"을 만들고이를 원래 xaml에 추가합니다.

그래서 나는 이와 같은 것을 원합니다. 이전에 어떤 시도도 할 수 없습니다. 어떻게 할 수 있는지 정말 모르니까요.

Grid new_grid = new Grid; 
new_grid = load from file (areaRoom.xaml); (file is among the project's 
resources) 
areaGeneric = new_grid; 

런타임시 그리드 xaml을로드 한 다음 메인 코드에서 그리드를 전환 할 수 있습니까?

감사합니다, Evgenie

답변

1

정말 간단한 솔루션은 사용자 컨트롤 내부에 각 객실을 수용 한 다음 객실을 변경해야 할 때 컨테이너 그리드에 컨트롤을 배치하는 것입니다.

public partial class MainWindow : Window 
{ 
    UserControl _currentRoom; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnPreviewMouseDown(MouseButtonEventArgs e) 
    { 
     this.areaContainer.Children.Clear(); 
     _currentRoom = null; 

     if (e.LeftButton == MouseButtonState.Pressed) 
      _currentRoom = new Room1(); 
     if(e.RightButton == MouseButtonState.Pressed) 
      _currentRoom = new Room2(); 

     this.areaContainer.Children.Add(_currentRoom); 
     base.OnPreviewMouseDown(e); 
    } 

} 

A "룸": 여기에 거친 아이디어 자원을 정화로

<UserControl x:Class="Test.Room1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
    <Button Height="100" Width="100"> 
     Hello world! 
    </Button> 
</UserControl> 

- 사용자 컨트롤이 시각적 트리에서 제거되면 (당신이 참조를 유지하지 않습니다 가정) GC는 사용자 정의 컨트롤을 처리해야합니다. 리소스를 더 빨리 지우고 싶다면 방에 처분 메소드를 구현 한 다음 영역을 변경하기 전에 호출 할 수 있습니다.

+0

불행히도 문제가 있습니다. 관련 그리드의 내부 이미지 \ buttons \ void는 작동하지 않습니다. " 'RealityIncognita.Room'은 'objHibernation1Pod4_MouseEnter'에 대한 정의를 포함하지 않고 'RealityIncognita.Room'유형의 첫 번째 인수를 허용하는 확장 메소드 'objHibernation1Pod4_MouseEnter'를 찾을 수 없습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?) – EvgenieT

+0

이 오류는 사용자가 방을 분리하기 전에 주 윈도우에 있던 사용자 정의 컨트롤의 코드에서 이벤트 핸들러가 누락되었다는 것을 나타내는 것 같습니다. 사용자 정의 컨트롤에 핸들러를 추가해야합니다. – Jonny

+0

미안하지만, 더 많은 질문이 있습니다. 첫째, 모든 것을 한꺼번에로드하는 것을 피하는 것이 었습니다. 그리드의 분리가 실제로이 작업에 도움이 될 것입니다. 문제는? 즉, 새 파일에 대한 모든 경로를 업데이트하면 어떻게됩니까? 그리고 두 번째 - 예제를 제공하거나 핸들러를 추가하는 방법을 정확히 링크 할 수 있습니까? 각 표에는 al 버튼과 공백은 없습니다 - 하나씩 연결해야합니까? – EvgenieT

관련 문제