优化结构

引用本体的宠物列表
This commit is contained in:
Hakoyu 2023-10-13 22:08:52 +08:00
parent 6d91b21011
commit ad70646656
12 changed files with 309 additions and 172 deletions

View File

@ -47,6 +47,15 @@ public class ModMaker : MainPlugin
{
// 载入ModMaker资源
Maker = new ModMakerWindow();
// 设置游戏版本
ModMakerInfo.GameVersion = MW.version;
// 载入本体宠物
foreach (var pet in MW.Pets)
{
var petModel = new PetModel();
petModel.Id.Value = pet.Name;
ModMakerInfo.Pets.Add(petModel);
}
//Maker.ModMaker = this;
Maker.Show();
Maker.Closed += Maker_Closed;

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VPet.ModMaker.Models.ModModel;
namespace VPet.ModMaker.Models;
@ -25,4 +26,11 @@ public static class ModMakerInfo
/// 信息文件
/// </summary>
public const string InfoFile = "info.lps";
/// <summary>
/// 游戏版本
/// </summary>
public static int GameVersion { get; set; } = 100;
public static List<PetModel> Pets { get; } = new();
}

View File

@ -87,6 +87,10 @@ public class FoodModel : I18nModel<I18nFoodModel>
/// </summary>
public ObservableValue<BitmapImage> Image { get; } = new();
public ObservableValue<double> ReferencePrice { get; } = new();
private readonly Food _food = new();
public FoodModel()
{
DescriptionId.Value = $"{Id.Value}_{nameof(DescriptionId)}";
@ -94,6 +98,19 @@ public class FoodModel : I18nModel<I18nFoodModel>
{
DescriptionId.Value = $"{n}_{nameof(DescriptionId)}";
};
ReferencePrice.AddNotifyReceiver(
Strength,
StrengthFood,
StrengthDrink,
Feeling,
Health,
Likability,
Exp
);
ReferencePrice.NotifyReceived += (ref double v) =>
{
v = Math.Floor(SetValueToFood(_food).RealPrice);
};
}
public FoodModel(FoodModel model)
@ -155,6 +172,18 @@ public class FoodModel : I18nModel<I18nFoodModel>
};
}
public Food SetValueToFood(Food food)
{
food.Strength = Strength.Value;
food.StrengthFood = StrengthFood.Value;
food.StrengthDrink = StrengthDrink.Value;
food.Feeling = Feeling.Value;
food.Health = Health.Value;
food.Likability = Likability.Value;
food.Exp = Exp.Value;
return food;
}
public void Close()
{
Image.Value?.StreamSource?.Close();

View File

@ -56,12 +56,12 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
/// <summary>
/// 支持的游戏版本
/// </summary>
public ObservableValue<string> GameVersion { get; } = new();
public ObservableValue<int> GameVersion { get; } = new(ModMakerInfo.GameVersion);
/// <summary>
/// 模组版本
/// </summary>
public ObservableValue<string> ModVersion { get; } = new();
public ObservableValue<int> ModVersion { get; } = new(100);
/// <summary>
/// 封面
@ -96,7 +96,7 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
/// <summary>
/// 宠物
/// </summary>
public ObservableCollection<PetModel> Pets { get; } = new();
public ObservableCollection<PetModel> Pets { get; } = new(ModMakerInfo.Pets);
/// <summary>
/// 其它I18n数据
@ -106,8 +106,7 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
/// <summary>
/// 需要保存的I18n数据
/// </summary>
private readonly Dictionary<string, Dictionary<string, string>> _saveI18nDatas = new();
public static Dictionary<string, Dictionary<string, string>> SaveI18nDatas { get; } = new();
public ModInfoModel()
{
@ -125,8 +124,8 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
Id.Value = loader.Name;
DescriptionId.Value = loader.Intro;
Author.Value = loader.Author;
GameVersion.Value = loader.GameVer.ToString();
ModVersion.Value = loader.Ver.ToString();
GameVersion.Value = loader.GameVer;
ModVersion.Value = loader.Ver;
ItemID = loader.ItemID;
AuthorID = loader.AuthorID;
var imagePath = Path.Combine(loader.ModPath.FullName, "icon.png");
@ -144,7 +143,6 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
{
var petModel = new PetModel(pet);
Pets.Add(petModel);
// TODO: 动画加载
foreach (var p in pet.path)
{
LoadAnime(petModel, p);
@ -317,6 +315,7 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
/// <param name="path">路径</param>
public void SaveTo(string path)
{
SaveI18nDatas.Clear();
// 保存模型信息
SaveModInfo(path);
// 保存模组数据
@ -325,6 +324,7 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
SaveText(path);
SaveI18nData(path);
SaveImage(path);
SaveI18nDatas.Clear();
}
/// <summary>
@ -337,9 +337,9 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
if (File.Exists(modInfoFile) is false)
File.Create(modInfoFile).Close();
_saveI18nDatas.Clear();
SaveI18nDatas.Clear();
foreach (var cultureName in I18nHelper.Current.CultureNames)
_saveI18nDatas.Add(cultureName, new());
SaveI18nDatas.Add(cultureName, new());
var lps = new LPS()
{
@ -368,11 +368,6 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
File.WriteAllText(modInfoFile, lps.ToString());
}
#region SavePet
/// <summary>
/// 保存宠物
/// </summary>
/// <param name="path">路径</param>
private void SavePets(string path)
{
var petPath = Path.Combine(path, "pet");
@ -385,137 +380,13 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
Directory.CreateDirectory(petPath);
foreach (var pet in Pets)
{
foreach (var cultureName in I18nHelper.Current.CultureNames)
{
_saveI18nDatas[cultureName].TryAdd(
pet.Id.Value,
pet.I18nDatas[cultureName].Name.Value
);
_saveI18nDatas[cultureName].TryAdd(
pet.DescriptionId.Value,
pet.I18nDatas[cultureName].Description.Value
);
}
var petFile = Path.Combine(petPath, $"{pet.Id.Value}.lps");
if (File.Exists(petFile) is false)
File.Create(petFile).Close();
var lps = new LPS();
SavePetInfo(lps, pet);
SaveWorksInfo(lps, pet);
SaveMoveInfo(lps, pet);
File.WriteAllText(petFile, lps.ToString());
var petAnimePath = Path.Combine(petPath, pet.Id.Value);
foreach (var animeType in pet.Animes)
animeType.Save(petAnimePath);
pet.Save(petPath);
}
// 如果没有一个完成保存, 则删除文件夹
if (Directory.EnumerateFiles(petPath).Any() is false)
Directory.Delete(petPath);
}
/// <summary>
/// 保存移动信息
/// </summary>
/// <param name="lps"></param>
/// <param name="pet"></param>
void SaveMoveInfo(LPS lps, PetModel pet)
{
foreach (var move in pet.Moves)
{
lps.Add(LPSConvert.SerializeObjectToLine<Line>(move.ToMove(), "move"));
}
}
/// <summary>
/// 保存工作信息
/// </summary>
/// <param name="lps"></param>
/// <param name="pet"></param>
void SaveWorksInfo(LPS lps, PetModel pet)
{
foreach (var work in pet.Works)
{
lps.Add(LPSConvert.SerializeObjectToLine<Line>(work.ToWork(), "work"));
foreach (var cultureName in I18nHelper.Current.CultureNames)
{
_saveI18nDatas[cultureName].TryAdd(
work.Id.Value,
work.I18nDatas[cultureName].Name.Value
);
}
}
}
/// <summary>
/// 保存宠物信息
/// </summary>
/// <param name="lps"></param>
/// <param name="pet"></param>
private void SavePetInfo(LPS lps, PetModel pet)
{
lps.Add(
new Line("pet", pet.Id.Value)
{
new Sub("intor", pet.DescriptionId.Value),
new Sub("path", pet.Id.Value),
new Sub("petname", pet.Id.Value)
}
);
lps.Add(
new Line("touchhead")
{
new Sub("px", pet.TouchHeadRect.Value.X.Value),
new Sub("py", pet.TouchHeadRect.Value.Y.Value),
new Sub("sw", pet.TouchHeadRect.Value.Width.Value),
new Sub("sh", pet.TouchHeadRect.Value.Height.Value),
}
);
lps.Add(
new Line("touchraised")
{
new Sub("happy_px", pet.TouchRaisedRect.Value.Happy.Value.X.Value),
new Sub("happy_py", pet.TouchRaisedRect.Value.Happy.Value.Y.Value),
new Sub("happy_sw", pet.TouchRaisedRect.Value.Happy.Value.Width.Value),
new Sub("happy_sh", pet.TouchRaisedRect.Value.Happy.Value.Height.Value),
//
new Sub("nomal_px", pet.TouchRaisedRect.Value.Nomal.Value.X.Value),
new Sub("nomal_py", pet.TouchRaisedRect.Value.Nomal.Value.Y.Value),
new Sub("nomal_sw", pet.TouchRaisedRect.Value.Nomal.Value.Width.Value),
new Sub("nomal_sh", pet.TouchRaisedRect.Value.Nomal.Value.Height.Value),
//
new Sub("poorcondition_px", pet.TouchRaisedRect.Value.PoorCondition.Value.X.Value),
new Sub("poorcondition_py", pet.TouchRaisedRect.Value.PoorCondition.Value.Y.Value),
new Sub(
"poorcondition_sw",
pet.TouchRaisedRect.Value.PoorCondition.Value.Width.Value
),
new Sub(
"poorcondition_sh",
pet.TouchRaisedRect.Value.PoorCondition.Value.Height.Value
),
//
new Sub("ill_px", pet.TouchRaisedRect.Value.Ill.Value.X.Value),
new Sub("ill_py", pet.TouchRaisedRect.Value.Ill.Value.Y.Value),
new Sub("ill_sw", pet.TouchRaisedRect.Value.Ill.Value.Width.Value),
new Sub("ill_sh", pet.TouchRaisedRect.Value.Ill.Value.Height.Value),
}
);
lps.Add(
new Line("raisepoint")
{
new Sub("happy_x", pet.RaisePoint.Value.Happy.Value.X.Value),
new Sub("happy_y", pet.RaisePoint.Value.Happy.Value.Y.Value),
//
new Sub("nomal_x", pet.RaisePoint.Value.Nomal.Value.X.Value),
new Sub("nomal_y", pet.RaisePoint.Value.Nomal.Value.Y.Value),
//
new Sub("poorcondition_x", pet.RaisePoint.Value.PoorCondition.Value.X.Value),
new Sub("poorcondition_y", pet.RaisePoint.Value.PoorCondition.Value.Y.Value),
//
new Sub("ill_x", pet.RaisePoint.Value.Ill.Value.X.Value),
new Sub("ill_y", pet.RaisePoint.Value.Ill.Value.Y.Value),
}
);
}
#endregion
/// <summary>
/// 保存食物
/// </summary>
@ -539,11 +410,11 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
lps.Add(LPSConvert.SerializeObjectToLine<Line>(food.ToFood(), "food"));
foreach (var cultureName in I18nHelper.Current.CultureNames)
{
_saveI18nDatas[cultureName].TryAdd(
SaveI18nDatas[cultureName].TryAdd(
food.Id.Value,
food.I18nDatas[cultureName].Name.Value
);
_saveI18nDatas[cultureName].TryAdd(
SaveI18nDatas[cultureName].TryAdd(
food.DescriptionId.Value,
food.I18nDatas[cultureName].Description.Value
);
@ -588,11 +459,11 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
lps.Add(LPSConvert.SerializeObjectToLine<Line>(text.ToSelectText(), "SelectText"));
foreach (var cultureName in I18nHelper.Current.CultureNames)
{
_saveI18nDatas[cultureName].TryAdd(
SaveI18nDatas[cultureName].TryAdd(
text.Id.Value,
text.I18nDatas[cultureName].Text.Value
);
_saveI18nDatas[cultureName].TryAdd(
SaveI18nDatas[cultureName].TryAdd(
text.ChooseId.Value,
text.I18nDatas[cultureName].Choose.Value
);
@ -617,7 +488,7 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
lps.Add(LPSConvert.SerializeObjectToLine<Line>(text.ToLowText(), "lowfoodtext"));
foreach (var cultureName in I18nHelper.Current.CultureNames)
{
_saveI18nDatas[cultureName].TryAdd(
SaveI18nDatas[cultureName].TryAdd(
text.Id.Value,
text.I18nDatas[cultureName].Text.Value
);
@ -642,7 +513,7 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
lps.Add(LPSConvert.SerializeObjectToLine<Line>(text.ToClickText(), "clicktext"));
foreach (var cultureName in I18nHelper.Current.CultureNames)
{
_saveI18nDatas[cultureName].TryAdd(
SaveI18nDatas[cultureName].TryAdd(
text.Id.Value,
text.I18nDatas[cultureName].Text.Value
);
@ -666,7 +537,7 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
var cultureFile = Path.Combine(culturePath, $"{cultureName}.lps");
File.Create(cultureFile).Close();
var lps = new LPS();
foreach (var data in _saveI18nDatas[cultureName])
foreach (var data in SaveI18nDatas[cultureName])
lps.Add(new Line(data.Key, data.Value));
File.WriteAllText(cultureFile, lps.ToString());
}

View File

@ -1,7 +1,10 @@
using HKW.HKWViewModels.SimpleObservable;
using LinePutScript;
using LinePutScript.Converter;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@ -67,6 +70,8 @@ public class PetModel : I18nModel<I18nPetInfoModel>
/// </summary>
public ObservableCollection<AnimeTypeModel> Animes { get; } = new();
public bool IsSimplePetModel { get; } = false;
public PetModel()
{
DescriptionId.Value = $"{Id.Value}_{nameof(DescriptionId)}";
@ -152,7 +157,165 @@ public class PetModel : I18nModel<I18nPetInfoModel>
Moves.Add(new(move));
}
public PetModel(PetLoader loader, bool isSimplePet)
: this()
{
Id.Value = loader.PetName;
IsSimplePetModel = isSimplePet;
}
public void Close() { }
#region Save
/// <summary>
/// 保存宠物
/// </summary>
/// <param name="path">路径</param>
public void Save(string path)
{
if (IsSimplePetModel)
{
SaveSimplePetInfo(path);
return;
}
foreach (var cultureName in I18nHelper.Current.CultureNames)
{
ModInfoModel.SaveI18nDatas[cultureName].TryAdd(
Id.Value,
I18nDatas[cultureName].Name.Value
);
ModInfoModel.SaveI18nDatas[cultureName].TryAdd(
DescriptionId.Value,
I18nDatas[cultureName].Description.Value
);
}
var petFile = Path.Combine(path, $"{Id.Value}.lps");
if (File.Exists(petFile) is false)
File.Create(petFile).Close();
var lps = new LPS();
SavePetInfo(lps);
SaveWorksInfo(lps);
SaveMoveInfo(lps);
File.WriteAllText(petFile, lps.ToString());
var petAnimePath = Path.Combine(path, Id.Value);
foreach (var animeType in Animes)
animeType.Save(petAnimePath);
}
private void SaveSimplePetInfo(string path)
{
if (Works.Count == 0 && Moves.Count == 0 && Animes.Count == 0)
return;
var petFile = Path.Combine(path, $"{Id.Value}.lps");
var lps = new LPS { new Line("pet", Id.Value) { new Sub("path", Id.Value), } };
SaveWorksInfo(lps);
SaveMoveInfo(lps);
File.WriteAllText(petFile, lps.ToString());
var petAnimePath = Path.Combine(path, Id.Value);
foreach (var animeType in Animes)
animeType.Save(petAnimePath);
}
/// <summary>
/// 保存移动信息
/// </summary>
/// <param name="lps"></param>
/// <param name="pet"></param>
void SaveMoveInfo(LPS lps)
{
foreach (var move in Moves)
{
lps.Add(LPSConvert.SerializeObjectToLine<Line>(move.ToMove(), "move"));
}
}
/// <summary>
/// 保存工作信息
/// </summary>
/// <param name="lps"></param>
/// <param name="pet"></param>
void SaveWorksInfo(LPS lps)
{
foreach (var work in Works)
{
lps.Add(LPSConvert.SerializeObjectToLine<Line>(work.ToWork(), "work"));
foreach (var cultureName in I18nHelper.Current.CultureNames)
{
ModInfoModel.SaveI18nDatas[cultureName].TryAdd(
work.Id.Value,
work.I18nDatas[cultureName].Name.Value
);
}
}
}
/// <summary>
/// 保存宠物信息
/// </summary>
/// <param name="lps"></param>
/// <param name="pet"></param>
private void SavePetInfo(LPS lps)
{
lps.Add(
new Line("pet", Id.Value)
{
new Sub("intor", DescriptionId.Value),
new Sub("path", Id.Value),
new Sub("petname", Id.Value)
}
);
lps.Add(
new Line("touchhead")
{
new Sub("px", TouchHeadRect.Value.X.Value),
new Sub("py", TouchHeadRect.Value.Y.Value),
new Sub("sw", TouchHeadRect.Value.Width.Value),
new Sub("sh", TouchHeadRect.Value.Height.Value),
}
);
lps.Add(
new Line("touchraised")
{
new Sub("happy_px", TouchRaisedRect.Value.Happy.Value.X.Value),
new Sub("happy_py", TouchRaisedRect.Value.Happy.Value.Y.Value),
new Sub("happy_sw", TouchRaisedRect.Value.Happy.Value.Width.Value),
new Sub("happy_sh", TouchRaisedRect.Value.Happy.Value.Height.Value),
//
new Sub("nomal_px", TouchRaisedRect.Value.Nomal.Value.X.Value),
new Sub("nomal_py", TouchRaisedRect.Value.Nomal.Value.Y.Value),
new Sub("nomal_sw", TouchRaisedRect.Value.Nomal.Value.Width.Value),
new Sub("nomal_sh", TouchRaisedRect.Value.Nomal.Value.Height.Value),
//
new Sub("poorcondition_px", TouchRaisedRect.Value.PoorCondition.Value.X.Value),
new Sub("poorcondition_py", TouchRaisedRect.Value.PoorCondition.Value.Y.Value),
new Sub("poorcondition_sw", TouchRaisedRect.Value.PoorCondition.Value.Width.Value),
new Sub("poorcondition_sh", TouchRaisedRect.Value.PoorCondition.Value.Height.Value),
//
new Sub("ill_px", TouchRaisedRect.Value.Ill.Value.X.Value),
new Sub("ill_py", TouchRaisedRect.Value.Ill.Value.Y.Value),
new Sub("ill_sw", TouchRaisedRect.Value.Ill.Value.Width.Value),
new Sub("ill_sh", TouchRaisedRect.Value.Ill.Value.Height.Value),
}
);
lps.Add(
new Line("raisepoint")
{
new Sub("happy_x", RaisePoint.Value.Happy.Value.X.Value),
new Sub("happy_y", RaisePoint.Value.Happy.Value.Y.Value),
//
new Sub("nomal_x", RaisePoint.Value.Nomal.Value.X.Value),
new Sub("nomal_y", RaisePoint.Value.Nomal.Value.Y.Value),
//
new Sub("poorcondition_x", RaisePoint.Value.PoorCondition.Value.X.Value),
new Sub("poorcondition_y", RaisePoint.Value.PoorCondition.Value.Y.Value),
//
new Sub("ill_x", RaisePoint.Value.Ill.Value.X.Value),
new Sub("ill_y", RaisePoint.Value.Ill.Value.Y.Value),
}
);
}
#endregion
}
public class I18nPetInfoModel

View File

@ -20,17 +20,44 @@ public class FoodEditWindowVM
#region Value
public FoodModel OldFood { get; set; }
public ObservableValue<FoodModel> Food { get; } = new(new());
public ObservableValue<bool> AutoSetReferencePrice { get; } = new(false);
#endregion
#region Command
public ObservableCommand AddImageCommand { get; } = new();
public ObservableCommand ChangeImageCommand { get; } = new();
public ObservableCommand<double> SetReferencePriceCommand { get; } = new();
#endregion
public FoodEditWindowVM()
{
AddImageCommand.ExecuteEvent += AddImage;
ChangeImageCommand.ExecuteEvent += ChangeImage;
AutoSetReferencePrice.ValueChanged += AutoSetReferencePrice_ValueChanged;
SetReferencePriceCommand.ExecuteEvent += SetReferencePriceToPrice;
Food.Value.ReferencePrice.ValueChanged += ReferencePrice_ValueChanged;
}
private void AutoSetReferencePrice_ValueChanged(bool oldValue, bool newValue)
{
if (newValue)
{
SetReferencePriceToPrice(Food.Value.ReferencePrice.Value);
}
}
private void ReferencePrice_ValueChanged(double oldValue, double newValue)
{
if (AutoSetReferencePrice.Value)
{
SetReferencePriceToPrice(newValue);
}
}
private void SetReferencePriceToPrice(double value)
{
Food.Value.Price.Value = value;
}
public void Close()

View File

@ -91,18 +91,18 @@ public class MovePageVM
}
}
private void Remove(MoveModel food)
private void Remove(MoveModel model)
{
if (MessageBox.Show("确定删除吗".Translate(), "", MessageBoxButton.YesNo) is MessageBoxResult.No)
return;
if (ShowMoves.Value.Count == Moves.Count)
{
Moves.Remove(food);
Moves.Remove(model);
}
else
{
ShowMoves.Value.Remove(food);
Moves.Remove(food);
ShowMoves.Value.Remove(model);
Moves.Remove(model);
}
}
}

View File

@ -62,6 +62,11 @@ public class PetPageVM
public void Edit(PetModel model)
{
if (model.IsSimplePetModel.Value)
{
MessageBox.Show("这是本体自带的宠物, 无法编辑".Translate());
return;
}
var window = new PetEditWindow();
var vm = window.ViewModel;
vm.OldPet = model;
@ -81,18 +86,23 @@ public class PetPageVM
model.Close();
}
private void Remove(PetModel food)
private void Remove(PetModel model)
{
if (model.IsSimplePetModel.Value)
{
MessageBox.Show("这是本体自带的宠物, 无法删除".Translate());
return;
}
if (MessageBox.Show("确定删除吗".Translate(), "", MessageBoxButton.YesNo) is MessageBoxResult.No)
return;
if (ShowPets.Value.Count == Pets.Count)
{
Pets.Remove(food);
Pets.Remove(model);
}
else
{
ShowPets.Value.Remove(food);
Pets.Remove(food);
ShowPets.Value.Remove(model);
Pets.Remove(model);
}
}
}

View File

@ -91,18 +91,18 @@ public class WorkPageVM
}
}
private void Remove(WorkModel food)
private void Remove(WorkModel model)
{
if (MessageBox.Show("确定删除吗".Translate(), "", MessageBoxButton.YesNo) is MessageBoxResult.No)
return;
if (ShowWorks.Value.Count == Works.Count)
{
Works.Remove(food);
Works.Remove(model);
}
else
{
ShowWorks.Value.Remove(food);
Works.Remove(food);
ShowWorks.Value.Remove(model);
Works.Remove(model);
}
}
}

View File

@ -125,6 +125,7 @@
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Content="{ll:Str 饱腹值}" />
<pu:NumberInput
@ -163,10 +164,29 @@
Value="{Binding Food.Value.Exp.Value, Mode=TwoWay}" />
<Label Grid.Row="8" Content="{ll:Str 价格}" />
<pu:NumberInput
x:Name="NumberInput_Price"
Grid.Row="8"
Grid.Column="1"
Value="{Binding Food.Value.Price.Value, Mode=TwoWay}" />
<Label Grid.Row="9" Content="{ll:Str 参考价格}" />
<Grid Grid.Row="9" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Food.Value.ReferencePrice.Value}" />
<Button
Grid.Column="1"
Command="{Binding SetReferencePriceCommand}"
CommandParameter="{Binding Food.Value.ReferencePrice.Value}"
Content="{ll:Str 设置}" />
<pu:Switch
Grid.Column="2"
BoxHeight="16"
BoxWidth="30"
Content="{ll:Str 自动设置}"
IsChecked="{Binding AutoSetReferencePrice.Value}" />
</Grid>
</Grid>
</ScrollViewer>
<Grid Grid.Row="2">

View File

@ -89,34 +89,34 @@
<TextBox
Grid.Column="1"
pu:TextBoxHelper.Watermark="Id"
Text="{Binding ModInfo.Value.Id.Value}" />
Text="{Binding ModInfo.Value.Id.Value, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Row="1" Content="{ll:Str 作者}" />
<TextBox
x:Name="TextBox_Author"
Grid.Row="1"
Grid.Column="1"
pu:TextBoxHelper.Watermark="{ll:Str 作者}"
Text="{Binding ModInfo.Value.Author.Value}" />
Text="{Binding ModInfo.Value.Author.Value, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Row="2" Content="{ll:Str 游戏版本}" />
<TextBox
x:Name="TextBox_GameVersion"
Grid.Row="2"
Grid.Column="1"
pu:TextBoxHelper.Watermark="{ll:Str 游戏版本}"
Text="{Binding ModInfo.Value.GameVersion.Value}" />
Text="{Binding ModInfo.Value.GameVersion.Value, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Row="3" Content="{ll:Str 模组版本}" />
<TextBox
x:Name="TextBox_ModVersion"
Grid.Row="3"
Grid.Column="1"
pu:TextBoxHelper.Watermark="{ll:Str 模组版本}"
Text="{Binding ModInfo.Value.ModVersion.Value}" />
Text="{Binding ModInfo.Value.ModVersion.Value, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Row="4" Content="{ll:Str 模组名称}" />
<TextBox
Grid.Row="4"
Grid.Column="1"
pu:TextBoxHelper.Watermark="{ll:Str 模组名称}"
Text="{Binding ModInfo.Value.CurrentI18nData.Value.Name.Value}" />
Text="{Binding ModInfo.Value.CurrentI18nData.Value.Name.Value, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Row="5" Content="{ll:Str 模组介绍}" />
<TextBox
x:Name="TextBox_Description"
@ -126,7 +126,7 @@
VerticalContentAlignment="Top"
d:Text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
pu:TextBoxHelper.Watermark="{ll:Str 模组介绍}"
Text="{Binding ModInfo.Value.CurrentI18nData.Value.Description.Value}"
Text="{Binding ModInfo.Value.CurrentI18nData.Value.Description.Value, UpdateSourceTrigger=PropertyChanged}"
TextWrapping="Wrap" />
</Grid>
</ScrollViewer>

View File

@ -202,7 +202,7 @@
Grid.Row="4"
Grid.Column="1"
Value="{Binding Work.Value.Feeling.Value}" />
<Label Grid.Row="5" Content="{ll:Str 奖励倍率}" />
<Label Grid.Row="5" Content="{ll:Str 完成奖励倍率}" />
<pu:NumberInput
Grid.Row="5"
Grid.Column="1"
@ -211,12 +211,12 @@
<pu:NumberInput
Grid.Row="6"
Grid.Column="1"
Value="{Binding Work.Value.FinishBonus.Value}" />
Value="{Binding Work.Value.LevelLimit.Value}" />
<Label Grid.Row="7" Content="{ll:Str 花费时间(分钟)}" />
<pu:NumberInput
Grid.Row="7"
Grid.Column="1"
Value="{Binding Work.Value.FinishBonus.Value}" />
Value="{Binding Work.Value.Time.Value}" />
</Grid>
<Expander Grid.Row="1" Header="{ll:Str 界面样式}">
<Grid>